首页 > 解决方案 > 未终止的美元引号字符串创建 PostgreSQL 函数

问题描述

使用 PostgreSQL 12.3,我在尝试验证这个简单的plpgsql代码块时遇到了一些麻烦

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

错误是

Unterminated dollar-quoted string at or near "$$ begin prepare plan as select 1;"

我试过有和没有;after end。我也试过用sql而不是plpgsql. 知道什么是错的吗?

这是一个快速测试代码的 db-fiddle:

https://www.db-fiddle.com/f/KgRZcxXqJs2Lwe284Mj5y/3

标签: postgresqlpostgresql-12create-function

解决方案


问题不在于 $$ 引用:

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

当您在 dbfiddle 中运行它时,完整的错误输出是:

 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 中的 EXECUTE 是它自己的命令:

https://www.postgresql.org/docs/12/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

EXECUTE command-string [ INTO [STRICT] target ] [ USING expression [, ... ] ];

我会使用 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)



推荐阅读