未初始化的PL / pgSQL常量:是否可能?

时间:2013-05-29 15:30:17

标签: postgresql constants plpgsql

是否有可能在PL / pgSQL函数体中DECLARE一个常量变量(一次且仅一次)?

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

但是也许有一些正在进行的开发,或者某些技巧我不知道变量变为常量。

2 个答案:

答案 0 :(得分:3)

可能的解决方法:使用subblock

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'。这是一个标识符。

答案 1 :(得分:2)

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

postgres=# do $$
postgres$# declare c constant text := 'Ahoj';
postgres$# begin
postgres$#   raise notice '%', c;
postgres$# end;
postgres$# $$ language plpgsql;
NOTICE:  Ahoj
DO
postgres=# 
相关问题