2010-04-02 6 views
41

Con SQL Server, puedo ejecutar código código T-SQL ad hoc con lógica de procedimiento completa a través de SQL Server Management Studio o cualquier otro cliente. Empecé a trabajar con PostgreSQL y encontré una pequeña diferencia en que PGSQL requiere que cualquier lógica se incruste en una función.¿Cómo puedo ejecutar el código pl/pgsql sin crear una función?

¿Hay alguna manera de ejecutar código PL/PGSQL sin crear una función?

Respuesta

51

Postgres 9

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

Para cualquier persona que encuentre esta respuesta y la haya intentado solo para obtener "sintaxis de error" error en o cerca de "SELECT" ", necesita un BEGIN y un END. DO $$ BEGIN/* pl/pgsql aquí */END $$ –

+2

Pero, ¿cómo puede ese código devolver un resultado de consulta? Si pongo un SELECT en la parte pl/pgsql obtengo 'ERROR: la consulta no tiene destino para los datos del resultado' – isapir

+2

@Igal: No puede. No puede devolver nada de una declaración 'DO'. Puede generar avisos o escribir en una tabla temporal o abrir un cursor como posibles soluciones. –

5

No, todavía no. La versión 9.0 (todavía alfa) tendrá esta opción (do), debes esperar hasta que se lance.

+0

+1, pero creo que fue anunciado el 8,5 - http://developer.postgresql.org/pgdocs/postgres/release-8.5.html –

+1

pensé que se convirtió en 8,5 9,0 debido a algunas características importantes que se implementaron ... –

+0

Ah, eso lo explicaría. –

1

que luchaban para conseguir este trabajo porque es bastante estricto en cuanto a la adición de puntos y comas exactamente en los lugares correctos. Pero una vez que te acostumbras, funciona bien. Además de la imposibilidad de devolver registros, por supuesto, puede elevar avisos & excepciones y hacer las otras soluciones como el uso de tablas temporales como @ErwinBrandstetter señaló en un comentario anterior.

por ejemplo:

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

Creo que la posibilidad de devolver filas, similar a los procedimientos almacenados de SQL Server/Oracle, viene en la próxima versión de PostgreSQL. Por qué ha tardado tanto esto está más allá de mí. –

Cuestiones relacionadas