在PostgreSQL中,DEFAULT局部变量与使用DEQUE初始化局部变量

nzk0hqpo  于 12个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(218)

首先,我实验了DEFAULT局部变量value,它有2,如下所示:

CREATE FUNCTION my_func() RETURNS INTEGER AS $$
DECLARE
  value INTEGER DEFAULT 2; -- Here
BEGIN
  IF value = 2 THEN
    value := 4;
    RETURN value;
  ELSE
    value := 2;
    RETURN value;
  END IF;
END;
$$ LANGUAGE plpgsql;

字符串
然后,my_func()返回4两次,而不返回42,如下所示:

postgres=# SELECT my_func();
 my_func
---------
       4
(1 row)
postgres=# SELECT my_func();
 my_func
---------
       4
(1 row)


其次,我实验了初始化的局部变量value,它有2,如下所示:

CREATE FUNCTION my_func() RETURNS INTEGER AS $$
DECLARE
  value INTEGER := 2; -- Here
BEGIN
  IF value = 2 THEN
    value := 4;
    RETURN value;
  ELSE
    value := 2;
    RETURN value;
  END IF;
END;
$$ LANGUAGE plpgsql;


然后,my_func()返回4两次,而不返回42,如下所示:

apple=# SELECT my_func();
 my_func
---------
       4
(1 row)
apple=# SELECT my_func();
 my_func
---------
       4
(1 row)


DEFAULT局部变量和初始化的局部变量有什么区别?

um6iljoc

um6iljoc1#

如果您的目标是保存一个值,那么将其保存到一个表中。要在会话期间持久化它,请将其设置为temp表。对于事务,请设置为temp...on commit drop
您也可以使用custom parameters并从函数内部更改它们。

set my.var=2;

字符串
否则,您的value变量只在函数执行期间存在,并且每次调用时都会单独重新初始化。

set my.var=2;

CREATE FUNCTION my_func() RETURNS INTEGER AS $f$
BEGIN
  IF current_setting('my.var',true)::int = 2 THEN
    set my.var = 4;
    RETURN current_setting('my.var');
  ELSE
    set my.var = 2;
    RETURN current_setting('my.var');
  END IF;
END;
$f$ LANGUAGE plpgsql;

select my_func();


| 我的函数|
| --|
| 4 |

select my_func();
select my_func();
select my_func();


| 我的函数|
| --|
| 2 |
| 我的函数|
| --|
| 4 |
| 我的函数|
| --|
| 2 |
Demo at db<>fiddle

相关问题