带有变量插值的命令行中的 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 语法错误的主要内容,如果未能解决你的问题,请参考以下文章
之前的 Erlang 语法错误:第 55 行中的 'end'
Inflector.php 第 265 行中的 FatalErrorException:语法错误,意外 ':',期待 ';'要么 ''