Da ist ein Weg.
Gegeben eine Tabelle t
und eine Funktion f()
, die einen anonymen Datensatz zurückgibt, der diesem Tabellentyp entspricht:
CREATE TABLE t (id int, d date);
Sie können nicht nur den anonymen Datensatz werfen, da eine Spalte Definitionsliste ist erforderlich für
SELECT * FROM f()
Zitieren des Handbuchs zum Befehl SELECT :
Wenn die Funktion so definiert wurde, dass sie den Datensatzdatentyp zurückgibt, muss ein Alias oder das Schlüsselwort AS
vorhanden sein, gefolgt von einer Spaltendefinitionsliste im Formular ...
Meine kühne Betonung.
Während all diese Abfragen funktionieren:
SELECT '(1,2013-11-11)'::t;
SELECT ('(1,2013-11-11)'::t).*;
SELECT f(); -- returning anonymous record
SELECT * FROM f() AS f(id int, d date);
Beides nicht:
SELECT * FROM f();
SELECT * FROM f()::t;
Letzteres wirft eine Ausnahme auf:
FEHLER: Typdatensatz kann nicht in t umgewandelt werden
Sie können die SELECT
Liste mit der Spaltendefinition in eine VIEW
oder eine Funktion wie @a_horse und @deszo einschließen . Das würde gut funktionieren:
CREATE OR REPLACE VIEW v1 AS
SELECT * FROM f() AS f(id int, d date);
Aber das würde Ihre Frage nicht beantworten:
Konvertieren Sie den Datensatz (oder den Satz des Datensatzrückgabetyps) in den T
Zeilentyp, ohne die Attribute aufzulisten.
Lösung für einzelne Reihe
Während eine Besetzung fehlschlägt, funktioniert eine Zuweisung in plpgsql .
CREATE OR REPLACE function f1(OUT rec t) AS
$func$
BEGIN
rec := f(); -- assignment succeeds where cast failed (!)
END
$func$ LANGUAGE plpgsql;
Anruf:
SELECT * FROM f1();
Während Sie mit diesem Muster auch eine Set-Return-Funktion schreiben können, habe ich keinen Weg gefunden, SELECT
von einer Set-Return-Funktion zu kommen, ohne eine Spaltendefinitionsliste anzugeben ...
-> SQLfiddle