der Fehler ist zwar nicht neu, aber ich habe noch nichts entsprechendes zur Lösung gefunden.
Ich möchte jeweils zwei oder mehr Varianten von ->vielen<- SQL-Anweisungen generieren. Jede Variante soll in eine eigene Spalte kommen und das ganze über “RETURNS SETOF tabelle” als Rückgabewert ausgegeben werden können. So a la “SELECT variante1 FROM sql_generator();” - so dass ich mehrere Rows mit einer Variante der SQL-Anweisungen erhalte. Da diese virtuelle Tabelle als Datentyp in der Datenbank natürlich nicht existiert, bekomme ich die Meldung “ERROR: a column definition list is required for functions returning “record”” Wie deklariere/definiere ich also einen neuen Tabellen-Typ und deren Spalten innerhalb der Funktion, damit dieser Fehler nicht mehr auftritt? Ich möchte keine extra Tabelle in der Datenbank anlegen.
Ich hatte es so probiert:
CREATE OR REPLACE FUNCTION sql_generator() RETURNS SETOF record AS
$$
DECLARE
r record;
.
.
.
Danke im voraus,
Du mußt dem Elefanten halt erklären, was Deine Funktion so von sich gibt:
test=# create or replace function get_r() returns record as $$declare r record;begin select into r 1,2;return r;end;$$language plpgsql;
CREATE FUNCTION
test=*# select * from get_r();
ERROR: a column definition list is required for functions returning "record"
test=!# rollback;
ROLLBACK
test=# create or replace function get_r() returns record as $$declare r record;begin select into r 1,2;return r;end;$$language plpgsql;
CREATE FUNCTION
test=*# select * from get_r() as (i int, j int);
i | j
---+---
1 | 2
(1 row)
Im übrigen geht das deutlich übersichtlicher mit IN und OUT - Parametern.
test=*# create or replace function get_r(OUT i int, OUT j int) returns record as $$begin select into i,j 1,2;return;end;$$language plpgsql;
CREATE FUNCTION
test=*# select * from get_r();
i | j
---+---
1 | 2
(1 row)