ERROR: a column definition list is required for functions returning "record"

Hallo,

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,

Data

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)

Andreas

Prima - war genau das, was mir noch fehlte. Danke für die prompte Hilfe.

Peter

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)

Andreas

Danke. So ist es natürlich am komfortabelsten. :smiley: