PostgreSQL中的局部变量

des4xlb0  于 5个月前  发布在  PostgreSQL
关注(0)|答案(2)|浏览(92)

有一个几乎相同的,但没有真正回答的问题here
我正在将一个应用程序从MS SQL Server迁移到PostgreSQL。在代码中的许多地方,我使用局部变量,所以我想做一些需要更少工作的更改,所以你能告诉我哪种是翻译以下代码的最佳方法吗?

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

字符串
这将返回:

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

(1 row(s) affected)


我将使用Postgresql 8.4甚至9.0,如果它包含重要的功能,将简化翻译。

9ceoxa92

9ceoxa921#

Postgresql历史上不支持命令级的过程代码-仅在函数中。然而,在Postgresql 9中,支持已添加到execute an inline code block,有效地支持类似的东西,尽管语法可能有点奇怪,并且与SQL Server相比有许多限制。值得注意的是,内联代码块不能返回结果集,所以不能用于上面概述的内容。
一般来说,如果你想写一些过程代码并让它返回一个结果,你需要把它放在一个函数中。例如:

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

字符串
据我所知,PostgreSQL连接协议不允许一个命令返回多个结果集,所以你不能简单地将T-SQL批处理或存储过程Map到PostgreSQL函数。

xfb7svmp

xfb7svmp2#

您可以在DECLARE clause中使用:==声明局部变量,如下所示。* :==DEFAULT是相同的,您可以在PL/pgSQL函数和过程中使用DECLARE子句声明局部变量:

CREATE FUNCTION my_func() RETURNS INTEGER AS $$
DECLARE
  value1 INTEGER := 1; -- Here
  value2 INTEGER = 2; -- Here
  value3 INTEGER DEFAULT 3; -- Here
BEGIN
RETURN value1 + value2 + value3;
END;
$$ LANGUAGE plpgsql;

字符串
并且,您可以在DECLARE子句中声明带有参数的局部变量,如下所示。* 只有类型的参数是可能的,就像下面的中间参数INTEGER一样,使用$1num1)和$2(中间参数INTEGER)是可能的:

CREATE FUNCTION my_func(num1 INTEGER, INTEGER, num3 INTEGER) RETURNS INTEGER AS $$
DECLARE
  value1 INTEGER := $1; -- Here
  value2 INTEGER := $2; -- Here
  value3 INTEGER := num3; -- Here
BEGIN
  RETURN value1 + value2 + value3;
END;
$$ LANGUAGE plpgsql;


并且,您可以在DECLARE子句中使用ALIAS FOR声明别名,如下所示。* 别名不能有类型,因为有错误,您可以在PL/pgSQL函数和过程中使用DECLARE子句声明别名:

CREATE FUNCTION my_func(num1 INTEGER, INTEGER, num3 INTEGER) RETURNS INTEGER AS $$
DECLARE
  value1 ALIAS FOR $1; -- Here
  value2 ALIAS FOR $2; -- Here
  value3 ALIAS FOR num3; -- Here
BEGIN
  RETURN value1 + value2 + value3;
END;
$$ LANGUAGE plpgsql;

相关问题