Cursor-basierte Datensätze in PostgreSQL
Ich versuche, verwenden Sie Cursor für eine Abfrage, die joins von mehreren Tabellen. Ich habe gesehen, dass bei oracle gibt es eine cursor-basierten Datensatz. Wenn ich versuche, das gleiche für Postgres, wirft es einige Fehler. Wie kann ich das gleiche tun in Postgres?
CREATE OR REPLACE FUNCTION avoidable_states()
RETURNS SETOF varchar AS
$BODY$
DECLARE
xyz CURSOR FOR select * from address ad
join city ct on ad.city_id = ct.city_id;
xyz_row RECORD;
BEGIN
open xyz;
LOOP
fetch xyz into xyz_row;
exit when xyz_row = null;
if xyz_row.city like '%hi%' then
return next xyz_row.city;
end if;
END LOOP;
close xyz;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
Fehler den ich bekomme, ist:
ERROR: relation "xyz" does not exist CONTEXT: compilation of PL/pgSQL function "avoidable_states" near line 4
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie einfach die
RECORD
Typ:1. Implizite cursor
Ist es fast immer besser, um die implizite cursor von einem
FOR
loop als resort zu einem etwas langsameren und unhandlich expliziten cursor. Ich habe geschrieben, Tausende von plpgsql-Funktionen und nur eine hand voll von Zeiten explizite Cursor keinen Sinn gemacht.Beiseite: es gibt nichts in der Funktion, die Sie brauchen würden Volatilität
VOLATILE
. VerwendenSTABLE
.2. Set-basierten Ansatz
Ist es fast immer besser, einen set-basierten Ansatz wenn möglich. Verwenden
RETURN QUERY
zurückkehren, wie aus einer Abfrage direkt.3. SQL-Funktion
Für den einfachen Fall (wahrscheinlich eine Vereinfachung), könnte man auch mit einem einfachen SQL-Funktion oder auch nur die Abfrage:
DECLARE
Teil der Funktion, klicken Sie dann verweisen Sie ihn nur per cursor-name in derFOR
- Schleife? Selbstverständlich, dass wenn die select-Anweisung ist nur ein paar Zeilen code, es macht nicht viel Unterschied. Aber wenn dieSELECT
Aussage ist 50 Zeilen code, dann ist es wirklich störend (für debugging Zwecke) zu haben, um SQL in Ihrem prozeduralen code.