Hallo,
laut DOc Kap. 7.2.1.4. Table Functions
kann ich eine Funktion, die ein setof zurückgibt , wie eine Tabelle verwenden.
Mein Problem nun ist, dass der Parameter, den ich der Funktion übergeben möchte, eben ein Parameter und damit variabel ist.
Postgres sagt dann:
FEHLER: ungültiger Verweis auf FROM-Klausel-Eintrag für Tabelle »op«
LINE 11: join getsusers(op.schemaname) as us on us.id = user_id;
^
HINT: Es gibt einen Eintrag für Tabelle »op«, aber auf ihn kann aus diesem Teil der Anfrage kein Bezug genommen werden.
Beispiel:
create or replace function getData( name varchar) returns setof blahblah as ( …)
Diese Funktion funktioniert, ich kann sie aufrufen mit
select id, name from getData(123) where blah blah…
alles OK soweit.
Jetzt ist der Parameter 123 aber nicht fix sondern kommt aus einem JOIN, Z.B.
select id, name , xx.nochwas
from bestellung op
join getData(op.spalte) as xx on xx… = …
where blah blah…
liefert oben genannte Fehlermeldung.
Das gleiche passiert, wenn ich das in ein WITH packe, also die Form
with order_data as (
select spalte, … from bestellung
…
)
select b.spate, xx.nochwas from order_data op
join getData (op.spalte) …
Wenn ich die beiden selects aufrufe und statt des parameters op.spalte einen konkreten Wert übergebe, funktioniert das jeweils.
Mal davon abgesehen, daß Du in Deiner Beschreibung ein INT als VARCHAR-Parameter an die Funktion übergibst denke ich mal, das wird so generell nicht gehen. Dein JOIN, welcher den Parameter liefert, kann ja potentiell auch mehr als einen Record liefern, schon das ist ein Problem. Der HINT im engl. lautet ja auch: “but it cannot be referenced from this part of the query”.
Also, was Du tun kannst, wäre eine Funktion zu schreiben, die das macht. Also, Deine Tabelle zu durchlaufen und für jede Zeile die Funktion aufzurufen, und das dann via RETURN NEXT auszugeben.
Falls Du einen Weg findest, daß doch noch als PLAIN SQL zu machen würde mich die Lösung sehr interessieren …