Plpgsql:如何在声明部分为变量赋值?

时间:2014-02-21 10:58:27

标签: postgresql plpgsql

例如。

--Assigning value to variable in function as a parameter.
create or replace function f1(number int :=1) --This method is not working to me. 

--Assigning values to variables at declaration section.
declare
       number int :=1; -- Here i need to assign the value to number but its not working.
       name varchar :='xyz'; 

3 个答案:

答案 0 :(得分:2)

以下是如何做到这一点:

create or replace function f1(my_number int default 1)

declare
my_number int :=1;

查看declaration documentation

答案 1 :(得分:1)

还有更多内容。

  

创建或替换函数f1(数字int:= 1) - 这个方法对我不起作用。

这有效:

CREATE OR REPLACE FUNCTION f1(number int = 1) ...

因为 := PL/pgSQL的赋值运算符,而SQL的 = 。此相关问题下的详细信息:

CREATE FUNCTION SQL语句,即使在创建plpgsql函数时也是如此。

在plpgsql内部,两种变体都被接受,但只有:=是正确的。 =是可以容忍的,因为人们犯了这么大的错误。 (更新:自第9.4页以来,两种变体都有记录。)但是,有一些情况下必须区分。例如,使用named parameters调用上述函数时。它必须是:

SELECT * FROM f1(number := 1);

更好的是,在Postgres 9.5或更高版本中,在函数调用中使用=>进行参数赋值:

SELECT * FROM f1(number => 1);

使用:

SELECT * FROM f1(number = 1);

... Postgres会将number = 1解释为SQL表达式并尝试对其进行评估,首先在调用语句的外部范围内查找标识符number。如果找不到,你会得到:

ERROR:  column "number" does not exist

这是幸运的情况,也是更常见的情况。如果在调用语句的范围内找到number 并且可以接受评估的boolean表达式作为函数参数,那么您已成功构建了邪恶陷阱< / strong>即可。如果您首先不了解:==之间的区别,则难以调试。

答案 2 :(得分:0)

分配值,一般注释

(关于为声明部分的变量赋值)

语言PLpgSQL语法有很多方法可以说:

 Y := f(X);

EXECUTE子句仅用于&#34;动态执行&#34; (表现不佳),

 EXECUTE 'f(X)' INTO Y;     

使用Y := f(X);SELECT执行静态声明,

 SELECT f(X) INTO Y;

在放弃结果时使用PERFORM声明或使用void返回:

 PERFORM f(X);