2010-04-02 6 views
41

Con SQL Server, posso eseguire codice T-SQL codice ad hoc con logica procedurale completa tramite SQL Server Management Studio o qualsiasi altro client. Ho iniziato a lavorare con PostgreSQL e ho avuto un po 'di differenza in quanto PGSQL richiede che qualsiasi logica sia incorporata in una funzione.Come posso eseguire il codice pl/pgsql senza creare una funzione?

Esiste un modo per eseguire codice PL/PGSQL senza creare un'esecuzione di una funzione?

risposta

51

Postgres 9

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

Per chi ha trovato questa risposta e l'ha provata solo per ottenere" ERRORE: sintassi errore ao vicino a "SELEZIONA" ", è necessario un BEGIN e END. DO $$ BEGIN/* pl/pgsql qui */END $$ –

+2

Ma come può il codice restituire un risultato di una query? Se metto un SELECT nella parte pl/pgsql ottengo 'ERRORE: la query non ha destinazione per i dati dei risultati' – isapir

+2

@Igal: non può. Non puoi restituire nulla da un'istruzione 'DO'. Puoi sollevare avvisi o scrivere su una tabella temporanea o aprire un cursore come possibili soluzioni alternative. –

5

No, non ancora. La versione 9.0 (ancora alpha) avrà questa opzione (do), devi aspettare che venga rilasciata.

+0

+1, ma credo che è stato annunciato per il 8,5 - http://developer.postgresql.org/pgdocs/postgres/release-8.5.html –

+1

ho pensato che è diventato 8.5 9.0 a causa di alcune delle principali funzionalità implementate ... –

+0

Ah, questo lo spiegherebbe. –

1

ho lottato per ottenere questo lavoro, perché è abbastanza stretto di aggiungere il punto e virgola esattamente al posto giusto. Ma una volta che ci si abitua, funziona bene. Oltre all'incapacità di restituire i record, ovviamente, è possibile sollevare le notifiche & e fare gli altri rimedi alternativi come l'utilizzo delle tabelle temporali come @ErwinBrandstetter sottolineato in un commento sopra.

esempio:

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

Penso che la possibilità di restituire righe, simile alle stored procedure SQL Server/Oracle, stia arrivando nella prossima versione di PostgreSQL. Perché quello ha impiegato così tanto è oltre me. –

Problemi correlati