带有变量插值的命令行中的psql语法错误

时间:2015-12-12 14:48:50

标签: postgresql plpgsql psql

我有一个类似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没有帮助。

1 个答案:

答案 0 :(得分:0)

PL / pgSQL错误

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;

psql错误

SQL interpolation feature of psql在字符串中不起作用。函数体DO命令恰好是一个普通字符串。你需要连接。像:

DO
$$
DECLARE
   varA text := $$ || :'cmd_line_arg' || $$
BEGIN
   PERFORM something(varA);
END
$$;

另请注意:'cmd_line_arg'中添加的引号。