2010-07-01 9 views
42

Il y a une question presque identique, mais pas vraiment répondu here.Comment déclarer des variables locales dans postgresql?

Je migre une application de MS SQL Server vers PostgreSQL. Dans de nombreux endroits du code, j'utilise des variables locales, donc je voudrais opter pour le changement qui nécessite moins de travail, alors pourriez-vous me dire quelle est la meilleure façon de traduire le code suivant?

-- MS SQL Syntax: declare 2 variables, assign value and return the sum of the two 
declare @One integer = 1 
declare @Two integer = 2 
select @One + @Two as SUM 

ce retour:

SUM 
----------- 
3 

(1 row(s) affected) 

Je vais utiliser Postgresql 8.4 ou même 9.0 si elle contient fetaures importantes qui simplifieront la traduction.

+0

cet article pourrait vous aider? http://stackoverflow.com/questions/36959/how-do-you-use-script-variables-in-postgresql – jheppinstall

+0

Possible identique à http://stackoverflow.com/questions/36959/how-do-you-use -script-variables-in-postgresql –

+0

On dirait que vous devez attendre 9.0 - ["DO - exécute un bloc de code anonyme"] (http://developer.postgresql.org/pgdocs/postgres/sql-do.html). –

Répondre

61

Historiquement, Postgresql ne prend pas en charge le code de procédure au niveau de la commande - uniquement dans les fonctions. Cependant, dans Postgresql 9, la prise en charge a été ajoutée à execute an inline code block qui prend en charge de manière efficace quelque chose comme ceci, bien que la syntaxe soit peut-être un peu étrange, et il existe de nombreuses restrictions par rapport à ce que vous pouvez faire avec SQL Server. Notamment, le bloc de code en ligne ne peut pas retourner un ensemble de résultats, donc ne peut pas être utilisé pour ce que vous avez décrit ci-dessus.

En général, si vous voulez écrire un code de procédure et lui retourner un résultat, vous devez le placer dans une fonction. Par exemple:

CREATE OR REPLACE FUNCTION somefuncname() RETURNS int LANGUAGE plpgsql AS $$ 
DECLARE 
    one int; 
    two int; 
BEGIN 
    one := 1; 
    two := 2; 
    RETURN one + two; 
END 
$$; 
SELECT somefuncname(); 

Le protocole de fil PostgreSQL n'a pas, pour autant que je sache, permettent des choses comme une commande de retour plusieurs jeux de résultats. Vous ne pouvez donc pas simplement mapper des lots T-SQL ou des procédures stockées aux fonctions PostgreSQL.

+0

le protocole de fil permet plusieurs commandes. et donc plusieurs ensembles de résultats différents (en mode asynchrone). – Jasen

+0

@Jasen Je voulais dire spécifiquement qu'une seule requête renvoyant plusieurs ensembles de résultats/résultats de résultats, plutôt que d'avoir plusieurs cycles de requête-réponse en vol. Bien que même cette situation peut avoir changé depuis 2010. – araqnid

+0

il peut être possible de réécrire la tâche comme plusieurs appels. 'select * de f1(); sélectionnez * à partir de f2(); select * from f3(); 'et ainsi recevoir plusieurs ensembles de résultats différents. – Jasen

Questions connexes