1

是否可以DECLARE稍后在 PL/pgSQL 函数的主体中分配一个常量变量(一次且仅一次)?

CREATE OR REPLACE FUNCTION foo() RETURNS void AS 
$$
   DECLARE
      dummy CONSTANT text;
   BEGIN
      -- ...do stuff...
      dummy := 'now I know';
      -- ...do more stuff...
   END;
$$ LANGUAGE 'plpgsql';       

我很确定这是不可能的,确实你会得到:

ERROR:  "dummy" is declared CONSTANT

但也许有一些正在进行的开发,或者我缺少一些技巧来以某种方式变量变为常量。

4

2 回答 2

3

可能的解决方法:使用子块

DO $do$
<< main >>
DECLARE
   dummy CONSTANT text;  -- without assingment it's just NULL
   myvar text;
BEGIN
   RAISE NOTICE 'dummy is >>%<<', dummy;          -- <NULL>
   -- dummy := 'foo';    -- would raise exception!

   SELECT INTO myvar age FROM event.age limit 1;  -- some computation

   << subblock >>
   DECLARE
      dummy CONSTANT text := myvar; -- assign result of earlier computation
   BEGIN
      RAISE NOTICE 'dummy is now >>%<<', dummy;                       -- 'boom'
      RAISE NOTICE 'same with subblock.dummy: >>%<<', subblock.dummy; -- 'boom'
      RAISE NOTICE 'dummy in outer block is >>%<<', main.dummy;       -- <NULL>
   END;

   RAISE NOTICE 'dummy is >>%<< again', dummy;                        -- <NULL>
END
$do$ LANGUAGE plpgsql;

继续子块直到函数结束,以准确模拟您所要求的内容。
请注意,子块的成本开销很小,因此除非您需要它,否则您不会使用它。

另外:永远不要引用'plpgsql'。这是一个标识符。

于 2013-06-07T00:55:01.277 回答
2

不,这是不可能的。您只能在 DECLARATION 部分设置常量的值。

postgres=# 做 $$
postgres$# 声明 c 常量文本 := 'Ahoj';
postgres$# 开始
postgres$# raise notice '%', c;
postgres$# 结束;
postgres$# $$ 语言 plpgsql;
注意:Ahoj
做
postgres=#
于 2013-06-01T17:37:37.790 回答