是否有可能在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
但是也许有一些正在进行的开发,或者某些技巧我不知道将变量变为常量。
答案 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)
postgres=# do $$ postgres$# declare c constant text := 'Ahoj'; postgres$# begin postgres$# raise notice '%', c; postgres$# end; postgres$# $$ language plpgsql; NOTICE: Ahoj DO postgres=#