PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Cursorbasierte Datensätze in PostgreSQL

1. Impliziter Cursor

Es ist fast immer besser, den impliziten Cursor eines FOR zu verwenden Schleife als auf einen etwas langsameren und unhandlicheren expliziten Cursor zurückzugreifen. Ich habe Tausende von plpgsql-Funktionen geschrieben und nur eine Handvoll Male machten explizite Cursor Sinn.

CREATE OR REPLACE FUNCTION avoidable_states()
  RETURNS SETOF varchar AS
$func$
DECLARE
    rec record;
BEGIN   
   FOR rec IN
      SELECT *
      FROM   address ad
      JOIN   city    ct USING (city_id)
   LOOP
      IF rec.city LIKE '%hi%' THEN
          RETURN NEXT rec.city;               
      END IF;
   END LOOP;
END
$func$  LANGUAGE plpgsql STABLE;

Abgesehen davon:Es gibt nichts in der Funktion, das die Volatilität VOLATILE benötigen würde . Verwenden Sie STABLE .

2. Set-basierter Ansatz

Es ist fast immer besser, wenn möglich einen satzbasierten Ansatz zu verwenden . Verwenden Sie RETURN QUERY direkt als Satz aus einer Abfrage zurückzugeben.

CREATE OR REPLACE FUNCTION avoidable_states()
  RETURNS SETOF varchar AS
$func$
BEGIN   
   RETURN QUERY
   SELECT ct.city
   FROM   address ad
   JOIN   city    ct USING (city_id)
   WHERE  ct.city LIKE '%hi%';
END
$func$  LANGUAGE plpgsql STABLE;

3. SQL-Funktion

Für den einfachen Fall (wahrscheinlich eine Vereinfachung) können Sie auch eine einfache SQL-Funktion verwenden oder sogar nur die Abfrage:

CREATE OR REPLACE FUNCTION avoidable_states()
  RETURNS SETOF varchar AS
$func$
   SELECT ct.city
   FROM   address ad
   JOIN   city    ct USING (city_id)
   WHERE  ct.city LIKE '%hi%';
$func$  LANGUAGE sql STABLE;