如何在postgresql中声明局部变量?

问题描述 投票:0回答:2

这里有一个几乎相同但没有真正回答的问题

我正在将应用程序从 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 包含可以简化翻译的重要功能,我将使用它。

sql-server postgresql migration
2个回答
110
投票
Postgresql 历史上不支持命令级别的过程代码 - 仅在函数内。然而,在 Postgresql 9 中,添加了对“执行内联代码块”的支持,它有效地支持类似的操作,尽管语法可能有点奇怪,并且与使用 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 批处理或存储过程映射到 PostgreSQL 函数。


您可以在

DECLARE 子句

0
投票
:=

=
DEFAULT
声明局部变量,如下所示。 *
:=
=
DEFAULT
相同:
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
 子句中使用 
ALIAS FOR

声明别名,如下所示。 *别名不能有类型,因为存在错误,并且只有类型的参数是可能的,如下面的中间参数 INTEGER 并使用

$1
(
num1
) 和
$2
(中间参数是可能的:
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;
并且,您可以在 

DECLARE
 子句中声明带有参数的局部变量,如下所示:

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;

    

© www.soinside.com 2019 - 2024. All rights reserved.