Proprietärer Code (den wir nicht ändern können) enthält eine Reihe von benutzerdefinierten Funktionen des Typs:
create or replace function f() returns record as $$ ... $$
was wir folgendermaßen nennen (zum Beispiel):
SELECT status, log FROM f() as (status boolean, log text);
(status boolean, log text)
ist ein Zeilentyp einer Tabelle T
. Ist es möglich, den record
(oder den setof record
Rückgabetyp) automatisch in den T
Zeilentyp zu konvertieren, ohne die Attribute aufzulisten? Was ich suche, ist von der Art:
SELECT * FROM f() as T%rowtype
Antworten:
Da ist ein Weg.
Gegeben eine Tabelle
t
und eine Funktionf()
, die einen anonymen Datensatz zurückgibt, der diesem Tabellentyp entspricht:Sie können nicht nur den anonymen Datensatz werfen, da eine Spalte Definitionsliste ist erforderlich für
Zitieren des Handbuchs zum Befehl SELECT :
Meine kühne Betonung.
Während all diese Abfragen funktionieren:
Beides nicht:
Letzteres wirft eine Ausnahme auf:
Sie können die
SELECT
Liste mit der Spaltendefinition in eineVIEW
oder eine Funktion wie @a_horse und @deszo einschließen . Das würde gut funktionieren:Aber das würde Ihre Frage nicht beantworten:
Lösung für einzelne Reihe
Während eine Besetzung fehlschlägt, funktioniert eine Zuweisung in plpgsql .
Anruf:
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
quelle
CREATE OR REPLACE function f1(OUT rec t) AS table type
durch ersetzenCREATE OR REPLACE function f1() returns setof T as...
.regclass
als Eingabe verwendet und einensetof
Datensatz zurückgibt (den Zeilentyp der entsprechenden Eingabe-Regclass). In diesem Fall kann ich keine Wrapper-Funktion erstellen, da der Rückgabetyp nur zur Ausführungszeit bekannt ist, oder?setof record
. Ich dachte über mögliche Problemumgehungen nach und erstellte das Einfügen von Werten aus einer Datensatzvariablen in eine Tabelle . Die Auswahl einer zurückgegebenen Funktionsetof T
ist relativ einfach. Aber ich gehe davon aus, dass Ihr Ausdruckset retuning function
tatsächlich bedeutetsetof record returning function
...