我有一个类似Postgres 9.4.5的场景:
CREATE OR REPLACE FUNCTION something(varA text) RETURNS void AS $$
BEGIN
...
RAISE INFO '%',varA;
END;
$$
LANGUAGE plpgsql;
DO
$$
declare
varA text := :cmd_line_arg;
begin
perform something(varA);
end;
$$
所有这些都驻留在某个文件plpgsql.sql
中,并执行如下:
psql -v cmd_line_arg='value' -U postgres -d postgres -f plpgsql.sql
我收到syntax error at or near
':'
使用字符串连接运算符||
时,我也发现了错误。
我在这里缺少什么?是否与DO
?
注意:此link没有帮助。
答案 0 :(得分:0)
PL / pgSQL RAISE
allows various syntax variants.你的不在其中。请尝试改为:
CREATE OR REPLACE FUNCTION something(varA text)
RETURNS void AS
$func$
BEGIN
...
RAISE INFO '%', varA;
END
$func$ LANGUAGE plpgsql;
SQL interpolation feature of psql在字符串中不起作用。函数体DO
命令恰好是一个普通字符串。你需要连接。像:
DO
$$
DECLARE
varA text := $$ || :'cmd_line_arg' || $$
BEGIN
PERFORM something(varA);
END
$$;
另请注意:'cmd_line_arg'
中添加的引号。