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

Posted

技术标签:

【中文标题】带有变量插值的命令行中的 psql 语法错误【英文标题】:psql syntax error at command line with variable interpolation 【发布时间】: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'),也失败了。 【参考方案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,通常应该在脚本中工作。

以上是关于带有变量插值的命令行中的 psql 语法错误的主要内容,如果未能解决你的问题,请参考以下文章

命令中的 Postgres 语法错误与文档一致

ES6基本语法

之前的 Erlang 语法错误:第 55 行中的 'end'

Inflector.php 第 265 行中的 FatalErrorException:语法错误,意外 ':',期待 ';'要么 ''

带有 env 变量的 ConfigParser 和字符串插值

PSQL 中的 CTE/with 子句