2010-04-02 11 views
41

Z programem SQL Server mogę wykonywać kod ad-hoc kodu T-SQL z pełną logiką proceduralną za pośrednictwem SQL Server Management Studio lub dowolnego innego klienta. Zacząłem pracować z PostgreSQL i miałem do czynienia z różnicą w tym, że PGSQL wymaga jakiejkolwiek logiki do osadzenia w funkcji.Jak mogę wykonać kod pl/pgsql bez tworzenia funkcji?

Czy istnieje sposób na wykonanie kodu PL/PGSQL bez konieczności wykonywania funkcji?

Odpowiedz

51

Postgres 9

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

Dla każdego, kto znalazł tę odpowiedź i próbował tylko uzyskać "BŁĄD: składnia błąd przy lub w pobliżu "SELECT" ", potrzebujesz BEGIN i END. DO $$ BEGIN/* pl/pgsql tutaj */END $$ –

+2

Ale w jaki sposób ten kod może zwrócić wynik zapytania? Jeśli wstawię SELECT w części pl/pgsql, otrzymam komunikat "ERROR: zapytanie nie ma miejsca docelowego dla danych wynikowych" – isapir

+2

@Igal: Nie może. Nie możesz zwrócić niczego z instrukcji "DO". Możesz podnosić powiadomienia lub pisać do tabeli tymczasowej lub otwierać kursor, jak tylko możliwe obejścia. –

5

Nie, jeszcze nie. Wersja 9.0 (nadal alfa) będzie miała tę opcję (nie), musisz poczekać, aż zostanie wydana.

+0

+1, ale myślę, że został ogłoszony przez 8,5 - http://developer.postgresql.org/pgdocs/postgres/release-8.5.html –

+1

Myślałem, że stała 9,0 8,5 z powodu kilku głównych funkcji, które zostały zaimplementowane ... –

+0

Ach, to by to wyjaśniło. –

1

zmagałem się uzyskać tej pracy, ponieważ jest to dość ścisły o dodanie średnikiem we właściwym miejscu. Ale gdy już się przyzwyczaisz, to działa dobrze. Poza brakiem możliwości zwracania rekordów oczywiście, możesz jednak zgłaszać wyjątki od & i robić inne obejścia, jak przy użyciu tabel tymczasowych, jak @ErwinBrandstetter wskazał w powyższym komentarzu.

np

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

Myślę, że możliwość zwracania wierszy, podobnie do SQL Server/Oracle procedur przechowywanych, jest w następnej wersji PostgreSQL. Dlaczego to trwało tak długo, jest poza mną. –

Powiązane problemy