postgresql - 未终止的美元引号字符串创建 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:
解决方案
问题不在于 $$ 引用:
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)
推荐阅读
- java - 在 switch 语句中使用扫描仪,但我的程序只保留打印默认值
- python - 分配之前引用的时间模块,但不是,时间模块是提前导入的。也许这是一个错误
- mp3 - 与其源 MP4 和 MP3 相比,组合 MP4 的大小增加
- javascript - MongoDB 聚合 $lookup 到具有管道语法和 _id 作为字符串的父数组字段
- javascript - 如何在 TypeScript 中定义类型的互斥属性?
- php - 数据库连接错误用户'root'@'localhost'的访问被拒绝(使用密码:否)
- c# - ASP.NET Core 自定义授权和内存缓存
- python - 带有dicts的可扩展迭代
- python - 如何通过 undetected_chromedriver.v2 获取 cookie 值?该站点使用 cloudflare。这是蟒蛇
- reactjs - next.js 如何在不触发按钮的情况下从子组件更改父状态?