【问题标题】:psql syntax error at command line with variable interpolation带有变量插值的命令行中的 psql 语法错误
【发布时间】:2015-12-12 14:48:49
【问题描述】:

我在 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 没有帮助。

【问题讨论】:

  • perform 可以在函数外使用吗?我相信它没有那样工作,所以我使用了 th do block
  • 你是对的。我把它误认为PREPARE。无论如何,请尝试将您的 cmd_line_arg 包含在 ' ' 中。
  • 不幸的是,将其包含在 '' 中,将其作为文字字符串而不是使用值。
  • 这可能是由于 DO 块。你能试试SELECT 1 FROM something(:'cmd_line_arg') LIMIT 0而不是你的DO块吗?您也可以尝试不使用' ',但我认为这也适用于您的 pg 版本
  • 不,这也不起作用。我也试过select something(:'cmd_line_arg'),也失败了。

标签: postgresql plpgsql psql


【解决方案1】:

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' 中添加的引号。

【讨论】:

  • 我意识到这一点并尝试使用 concat 运算符,但随后它开始抛出语法错误。它真的很奇怪。关于加薪,我已经纠正了。
  • @KoushikShetty:那么我建议的代码仍然会抛出错误吗?因为它对我有用...
  • 是的,它仍然是。我怀疑它现在是别的东西。甚至language 都在呕吐。是不是它没有被检测为plsql?我不知道了
  • @KoushikShetty。你可能有更多的错误。 plsql 是 Oracle 语言。它是 Postgres 的 plpgsql,通常应该在脚本中工作。
猜你喜欢
  • 2021-02-08
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 2021-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
相关资源
最近更新 更多