未终止的美元引号字符串创建PostgreSQL函数

未终止的美元引号字符串创建PostgreSQL函数,postgresql,postgresql-12,create-function,Postgresql,Postgresql 12,Create Function,使用PostgreSQL 12.3,我在尝试验证这段简单的plpgsql代码时遇到了一些问题 创建或替换功能测试() 返回无效 作为$$ 开始 按选择1编制计划; 执行计划; 结束; $$语言plpgsql; 错误是 Unterminated dollar-quoted string at or near "$$ begin prepare plan as select 1;" 我试过使用和不使用在结束后。我也尝试过使用sql而不是plpgsql。 你知道哪里不对吗 这是

使用PostgreSQL 12.3,我在尝试验证这段简单的
plpgsql
代码时遇到了一些问题

创建或替换功能测试()
返回无效
作为$$
开始
按选择1编制计划;
执行计划;
结束;
$$语言plpgsql;
错误是

Unterminated dollar-quoted string at or near "$$ begin prepare plan as select 1;"
我试过使用和不使用
结束后
。我也尝试过使用
sql
而不是
plpgsql
。 你知道哪里不对吗

这是一个db小提琴,用于快速测试代码:


问题不在于$$quoting:

create or replace function test() 
returns void 
as $$
begin
  prepare plan as select 1;
  execute plan;
end;
$$ language plpgsql;
CREATE FUNCTION

 select test();
ERROR:  column "plan" does not exist
LINE 1: SELECT plan
               ^
QUERY:  SELECT plan
CONTEXT:  PL/pgSQL function test() line 4 at EXECUTE
在DBFIDLE中运行此命令时,完整错误输出为:

 Schema Error: error: unterminated dollar-quoted string at or near "$$ begin prepare plan as select 1;"
Schema Error: error: prepared statement "plan" does not exist
Schema Error: error: unterminated dollar-quoted string at or near "$$ language plpgsql;"
Query Error: error: function test() does not exist 
问题在于,在plpgsql内部执行是它自己的命令:

使用表达式[,…]执行命令字符串[进入[STRICT]目标]

我会使用plpgsql表单。这项工作:

create or replace function test() 
returns void 
as $$
begin
  prepare plan as select 1;
  EXECUTE 'execute plan';
  RAISE NOTICE 'Made it';
  DEALLOCATE plan;
end;
$$ language plpgsql;

select test();
NOTICE:  Made it
 test 
------
 
(1 row)



让我猜猜,HeidiSQL?我猜,无论您使用哪个客户端来运行SQL,都不支持美元报价。您需要将每对
$
替换为一对
'
。请记住,如果函数体中有任何单引号,则需要对其进行转义。作为奖励,考虑检查DBeaver的SQL客户机。好的,我明白了。这只是一个客户的不能力J Spratt,感谢您介绍DBeaver,太棒了!谢谢你,阿德里安!是否可以从函数测试内部的EXECUTE返回多行?我的意思是,通过
返回表(…)
更改
返回void
,文档就是你的朋友。从这里开始。这里有,这里有“FOR-IN-EXECUTE
语句是迭代行的另一种方式:…”