2010-04-02 3 views
41

Mit SQL Server kann ich Code Ad-hoc-T-SQL-Code mit voller Verfahrenslogik über SQL Server Management Studio oder einen anderen Client ausführen. Ich habe begonnen, mit PostgreSQL zu arbeiten, und habe einen kleinen Unterschied darin gesehen, dass PGSQL erfordert, dass irgendeine Logik in eine Funktion eingebettet wird.Wie kann ich pl/pgsql-Code ausführen, ohne eine Funktion zu erstellen?

Gibt es eine Möglichkeit, PL/PGSQL-Code auszuführen, ohne eine Funktion auszuführen?

Antwort

51

Postgres 9

DO $$ 
-- declare 
BEGIN 
    /* pl/pgsql here */ 
END $$; 
+3

Für jeden, der diese Antwort gefunden und versucht es nur" ERROR: Syntax Fehler bei oder in der Nähe von "SELECT" ", Sie benötigen einen Anfang und Ende. DO $$ BEGIN/* pl/pgsql hier */END $$ –

+2

Aber wie kann dieser Code ein Abfrageergebnis zurückgeben? Wenn ich ein SELECT in den pl/pgsql Teil setze bekomme ich 'ERROR: Abfrage hat kein Ziel für Ergebnisdaten' – isapir

+2

@Igal: Es kann nicht. Sie können nichts von einer 'DO'-Anweisung zurückgeben. Sie können Benachrichtigungen erstellen oder in eine temporäre Tabelle schreiben oder einen Cursor als mögliche Problemumgehungen öffnen. –

5

Nein, noch nicht. Version 9.0 (noch Alpha) hat diese Option (do), Sie müssen warten, bis sie freigegeben wird.

+0

+1, aber ich denke, es ist für 8,5 angekündigt wurde - http://developer.postgresql.org/pgdocs/postgres/release-8.5.html –

+1

Ich dachte, dass 8,5 wurde 9,0 wegen einiger Hauptfunktionen, die implementiert wurden ... –

+0

Ah, das würde es erklären. –

1

Ich kämpfte diese Funktion zu erhalten, weil sie in genau den richtigen Stellen über das Hinzufügen von Semikolon ziemlich streng ist. Aber sobald man sich daran gewöhnt hat, funktioniert es gut. Abgesehen von der Unfähigkeit, Datensätze zurück zu geben, können Sie jedoch Benachrichtigungen ausgeben & Ausnahmen und die anderen Problemumgehungen wie die Verwendung von temporären Tabellen wie @ErwinBrandstetter in einem Kommentar oben hingewiesen.

zB:

DO 
$$ 
BEGIN 
    IF EXISTS(SELECT 'any rows?' 
       FROM {your_table} 
       WHERE {your_column} = 'blah') 
    THEN 
     RAISE NOTICE 'record exists'; 
    ELSE 
     RAISE EXCEPTION 'record does not exist'; 
    END IF; 

    DROP TABLE IF EXISTS foo; 

    CREATE TEMP TABLE foo AS 
    SELECT 'bar'::character varying(5) as baz; 
END 
$$; 

SELECT * FROM foo; 
+0

Ich denke, dass die Fähigkeit, Zeilen zurückzugeben, ähnlich den gespeicherten Prozeduren von SQL Server/Oracle, in der nächsten Version von PostgreSQL kommt. Warum das so lange gedauert hat, ist mir ein Rätsel. –

Verwandte Themen