2012-04-14 10 views
2

Ich habe SELECT dynamisch erzeugt. Ich versuche, das Ergebnis als SETOF RECORD zurückzugeben. Sth wie folgt aus:Postgres 9.1 Art des SETOF Datensatzes

CREATE FUNCTION test(column_name text) RETURNS SETOF RECORD AS $$ 
DECLARE 
    row RECORD; 
BEGIN 
    FOR row IN EXECUTE 'SELECT ' || quote_ident(column_name) || ' FROM dates' 
LOOP 
    RETURN NEXT row; 
END LOOP; 
RETURN; 
END; 
$$ LANGUAGE 'plpgsql'; 

Wenn ich versuche:

SELECT * FROM test('column1'); 

ich dieses:

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

Ich weiß, dass column1 Integer-Typ ist:

SELECT * FROM test('column1') f(a int); 

Ergebnis ist richtig, weil ich weiß, dass das Integer typ sein wird e.

Wenn ich versuche:

SELECT * FROM test('column1') f(a varchar); 

ich Fehler:

ERROR: wrong record type supplied in RETURN NEXT 
DETAIL: Returned type integer does not match expected type character varying in column 1. 

Nun meine Frage: Was der Teil querty zu tun, um loszuwerden, wo ich Typen ‚f (a int definieren) ". Es sollte möglich sein, weil Postgres bekannt ist, was zurückgegeben wird. Ich habe versucht mit unwiderlegbaren Optionen, aber ohne Erfolg.

+0

Wie kann 'column1' ein' int' in der ersten sein Beispiel und ein 'varchar' im zweiten Beispiel sein? –

+0

Es ist nicht, aber ich wollte zeigen, dass Postgres weiß, was Rückgabetyp ist. – zie1ony

+1

Es scheint mir, was Sie tun, ist genau das gleiche wie 'Spalte1 aus Daten auswählen. Warum benötigen Sie eine Funktion, um nur eine Spalte aus einer Tabelle zurückzugeben? Was ist das Problem, das Sie versuchen zu lösen? –

Antwort

5

Sie können den Wert in Text innerhalb der Funktion umwandeln und die Funktion RETURNS SETOF text deklarieren. Sie können auch die gesamte Ergebnismenge gleichzeitig zurückgeben. keine Notwendigkeit, explizit zu iterieren.

CREATE TABLE dates (column1 int, column2 date); 
INSERT INTO dates VALUES (1, date '2012-12-22'), (2, date '2013-01-01'); 

CREATE FUNCTION test(column_name text) RETURNS SETOF text AS $$ 
BEGIN 
    RETURN QUERY EXECUTE 'SELECT ' 
     || quote_ident(column_name) || '::text FROM dates'; 
END; 
$$ LANGUAGE 'plpgsql'; 

Jetzt SELECT test('column1'); ergibt:

test 
------ 
1 
2 
(2 rows) 

... und (mit meinen lokalen Einstellungen) SELECT test('column2'); ergibt:

test  
------------ 
2012-12-22 
2013-01-01 
(2 rows) 
+1

Vielen, sehr viel :) – zie1ony

0

Sie müssen OUT-Parameter angeben, die den Spalten entsprechen, die Sie zurückgeben möchten.

+0

Das ist nicht notwendig mit 'RETURN SETOF RECORD' –

+0

Aber was, wenn ich nicht weiß, wie viele Parameter ich zurückgeben werde? – zie1ony