2010-04-02 17 views
41

Avec SQL Server, je peux exécuter du code T-SQL code ad hoc avec une logique procédurale complète via SQL Server Management Studio ou tout autre client. J'ai commencé à travailler avec PostgreSQL et j'ai eu un peu de différence en ce sens que PGSQL nécessite l'intégration de toute logique dans une fonction.Comment puis-je exécuter un code pl/pgsql sans créer de fonction?

Existe-t-il un moyen d'exécuter du code PL/PGSQL sans créer une fonction?

Répondre

51

Postgres 9

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

Pour tous ceux qui ont trouvé cette réponse et l'ont essayé seulement pour obtenir" ERREUR: syntaxe erreur à ou près de "SELECT" ", vous avez besoin d'un BEGIN et END. DO $$ BEGIN/* pl/pgsql ici */END $$ –

+2

Mais comment ce code peut-il renvoyer un résultat de requête? Si je mets un SELECT dans la partie pl/pgsql, j'obtiens ERROR: la requête n'a pas de destination pour les données du résultat. – isapir

+2

@Igal: Cela ne peut pas. Vous ne pouvez rien retourner d'une instruction 'DO'. Vous pouvez générer des notifications ou écrire sur une table temporaire ou ouvrir un curseur en tant que solutions de contournement possibles. –

5

Non, pas encore. Version 9.0 (toujours alpha) aura cette option, vous devez attendre jusqu'à ce qu'il soit publié.

+0

+1, mais je pense qu'il a été annoncé pour 8,5 - http://developer.postgresql.org/pgdocs/postgres/release-8.5.html –

+1

Je pensais que 8,5 est devenu 9,0 à cause de quelques fonctionnalités majeures qui ont été implémentées ... –

+0

Ah, ça l'expliquerait. –

1

Je me suis battu pour obtenir ce travail parce qu'il est assez stricte sur l'ajout de points-virgules exactement dans les bons endroits. Mais une fois qu'on s'y habitue, ça marche bien. Outre l'impossibilité de renvoyer des enregistrements bien sûr, cependant vous pouvez déclencher des exceptions & et faire les autres solutions de contournement comme l'utilisation de tables temporaires comme @ErwinBrandstetter a souligné dans un commentaire ci-dessus.

par exemple:

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

Je pense que la possibilité de retourner des lignes, similaire aux procédures stockées SQL Server/Oracle, arrive dans la prochaine version de PostgreSQL. Pourquoi cela a pris autant de temps est au-delà de moi. –