Cómo declarar variables locales en postgresql?


Hay una pregunta casi idéntica, pero no realmente respondida aquí.

Estoy migrando una aplicación de MS SQL Server a PostgreSQL. En muchos lugares en el código uso variables locales, así que me gustaría ir por el cambio que requiere menos trabajo, así que ¿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)

Usaré Postgresql 8.4 o incluso 9.0 si contiene fetaures significativos que simplificarán traducción.

Author: Community, 2010-07-01

1 answers

Postgresql históricamente no soporta código de procedimiento a nivel de comando - solo dentro de funciones. Sin embargo, en Postgresql 9, se ha agregado soporte para ejecutar un bloque de código inline que efectivamente soporta algo como esto, aunque la sintaxis es quizás un poco extraña, y hay muchas restricciones en comparación con lo que puede hacer con SQL Server. En particular, el bloque de código en línea no puede devolver un conjunto de resultados, por lo que no se puede utilizar para lo que se describe anteriormente.

En general, si si desea escribir algún 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 permite, por lo que sé, cosas como que un comando devuelva varios conjuntos de resultados. Por lo tanto, no puede simplemente asignar lotes de T-SQL o procedimientos almacenados a funciones de PostgreSQL.

 63
Author: araqnid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-01 14:58:01