2009-04-12 14 views
2

Ich muss eine Select-Abfrage mit Joins machen. Dies sollte in einer Funktion geschrieben werden. Mein Ansatz hat nicht funktioniert:Postgres-Funktionen

CREATE OR REPLACE FUNCTION test2() 
RETURNS SETOF record AS' 
DECLARE 
    r record; 
BEGIN 
    for r in SELECT * FROM messages_wall INNER JOIN location ON 
     messages_wall.id = location.id 
     loop 
    return next r; 
    end loop; 
end; ' 
LANGUAGE 'plpgsql' 

ERROR: eine Spaltendefinitionsliste ist für Funktionen erforderlich „record“

Rückkehr ich diese Funktion aus einer .net-Anwendung aufrufen sollte. Wie soll ich vorgehen?

Antwort

2

Anstatt Tabelle in Ihre Funktion zu integrieren, können Sie Ansicht verwenden.

RETURNS SETOF Ihre Ansicht;

Sie haben wahrscheinlich r mit dem entsprechenden Datentyp zu definieren, zu:

r your_view%ROWTYPE; 

oder

Sie haben die Felder und Datentyp angeben.

SELECT * FROM test2() AS fields_1 as INTEGER, fields_2 AS ... ; 
+0

Ok, wie kann ich dies mit Npgsql tun, in ado.net? – Markus

+0

RETURNS SETOFF messages_wall - funktioniert nicht – Markus

+0

Entschuldigung, RETURNS SETOF sollte funktionieren. –

1

Für Ihr Beispiel ist ein Join in einer (PL/pgSQL) -Funktion überflüssig. Wie Luc M erwähnt hat, wäre eine Ansicht am einfachsten und schnellsten.

Wenn Sie darauf bestehen, eine Funktion zu haben, obwohl Ihre nächste Wahl sollte ein SQL function - mehr Info here und here sein.

3

SELECT * FROM test2() AS tabletest2 (id integer, name text); wenn Sie wirklich wollen, eine Funktion verwenden, sondern eine Ansicht ist besser, in diesem Fall