Ich frage mich, ob es eine Möglichkeit gibt, eine Variable vom Typ table in PL / pgSQL zu deklarieren, um Abfrageergebnisse zu speichern. Wie kann ich zum Beispiel etwas ausdrücken wie:
q1 = select * from foo;
q2 = select * from bar;
for t1 in q1:
for t2 in q2:
-- do something with t1 and t2
Ich habe mir das Konstrukt return next angesehen, aber das scheint nur mit Rückgabewerten umgehen zu können.
Antworten:
In PostgreSQL dient jeder Tabellenname automatisch als Typname für den Zeilentyp (auch als zusammengesetzter Typ bezeichnet ) - kein Tabellentyp, es gibt keine "Tabellentypen" oder "Tabellenvariablen" in Postgres ( aber es gibt typisierte Tabellen ).
Sie können also einfach eine Variable dieses Typs in deklarieren
PL/pgSQL
.Eine
FOR
Schleife arbeitet mit einem eingebauten Cursor. Es gibt auch explizite Cursor in plpgsql.Sie können auch einfach Variablen vom generischen Typ deklarieren
record
. Bei der Zuweisung kann automatisch jeder Zeilentyp verwendet werden. Es gelten jedoch besondere Regeln. Folgen Sie unbedingt dem Link und lesen Sie das Kapitel des Handbuchs!Während es oft bequem ist, die Funktion zurückgeben zu lassen
SETOF <table name>
, ist die RückgabeSETOF record
nicht so bequem. Das System weiß nicht, was die Funktion auf diese Weise zurückgibt, und Sie müssen bei jedem Aufruf eine Spaltendefinitionsliste hinzufügen. Welches ist ein Schmerz. Details zu Tabellenfunktionen im Handbuch .Oft gibt es jedoch effizientere Lösungen mit einfachem SQL. Looping ist ein Maß für den letzten Ausweg, wenn Sie Dinge in einem Scan ausführen können, bei denen Sie mehrere Scans in reinem SQL benötigen würden.
quelle
CREATE FUNCTION footest() RETURNS SETOF foo LANGUAGE PLPGSQL AS $$...