2010-07-01 31 views
42

Hay una pregunta casi idéntica, pero no realmente respondida here.¿Cómo declarar las variables locales en postgresql?

Estoy migrando una aplicación de MS SQL Server a PostgreSQL. En muchos lugares del código utilizo variables locales, por lo que me gustaría obtener el cambio que requiere menos trabajo, ¿podría decirme cuál es la mejor manera de traducir el siguiente código?

-- 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 

esto devuelve:

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

(1 row(s) affected) 

voy a utilizar PostgreSQL 8.4 o incluso 9.0 si contiene fetaures significativos que simplificarán la traducción.

+0

este post puede ayudar? http://stackoverflow.com/questions/36959/how-do-you-use-script-variables-in-postgresql – jheppinstall

+0

Posible idéntico a http://stackoverflow.com/questions/36959/how-do-you-use -script-variables-in-postgresql –

+0

Parece que tiene que esperar 9.0 - ["DO - ejecutar un bloque de código anónimo"] (http://developer.postgresql.org/pgdocs/postgres/sql-do.html) –

Respuesta

61

Postgresql históricamente no es compatible con el código de procedimiento en el nivel de comando, solo dentro de las funciones. Sin embargo, en Postgresql 9, el soporte se ha agregado a execute an inline code block que efectivamente es compatible con algo como esto, aunque la sintaxis es tal vez un poco extraña, y hay muchas restricciones en comparación con lo que puede hacer con SQL Server. Notablemente, el bloque de código en línea no puede devolver un conjunto de resultados, por lo que no puede utilizarse para lo que se describe anteriormente.

En general, si desea escribir un código de procedimiento y hacer que devuelva un resultado, debe ponerlo dentro de una función. Por ejemplo:

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(); 

El protocolo de conexión PostgreSQL no, por lo que yo sé, permiten cosas como un comando devolver varios conjuntos de resultados. Por lo tanto, no puede asignar simplemente lotes de T-SQL o procedimientos almacenados a las funciones de PostgreSQL.

+0

el protocolo de cable permite varios comandos. y así varios conjuntos de resultados diferentes (en modo asíncrono). – Jasen

+0

@Jasen Me refería específicamente a una sola consulta que devuelve múltiples recuentos de resultados/recuentos de resultados, en lugar de tener varios ciclos de consultas y respuestas en vuelo. Aunque incluso esa situación puede haber cambiado desde 2010. – araqnid

+0

puede ser posible volver a escribir la tarea como varias llamadas. 'select * from f1(); seleccione * de f2(); seleccione * de f3(); 'y reciba varios conjuntos de resultados diferentes. – Jasen

Cuestiones relacionadas