我看到一些
select
和 select into
语句可以在 PostgreSQL 的 PL/pgSQL DO
块中使用,而有些则不能(错误)。是什么原因导致这个错误?
create table countries(
country_id int
,code text);
下面第一个例子没有问题:
do $d$
declare ulke_id int;
begin
raise notice '%', (select country_id from countries where code = 'TR');
select c.country_id from countries c where code = 'TR' into ulke_id;
raise notice '%', ulke_id;
end $d$;
DO
以下代码给出错误:
do $d2$
declare ulke_id int;
begin
select country_id from countries where code = 'TR';
end $d2$;
ERROR: query has no destination for result data HINT: If you want to discard the results of a SELECT, use PERFORM instead. CONTEXT: PL/pgSQL function inline_code_block line 6 at SQL statement
还有这个:
-- The following codes give errors
do $d3$
declare ulke_id int;
begin
select * into copy_table from countries;
end $d3$;
ERROR: "copy_table" is not a known variable LINE 8: select * into copy_table from countries; ^
我收到这些错误消息的原因是什么?
我猜您的期望是 PL/pgSQL 提供 Postgres 简单、常规 SQL 语法的严格超集,但事实并非如此。在简单的 SQL 中,这样:
select x into output1 from table1;
意味着您正在尝试从
table1
获取数据并创建一个名为 ouput1
的新表,并将结果保存为其内容。同时,PL/pgSQL 不会尝试创建任何内容,而是期望 output1
是先前定义的已知变量。
使用在两种上下文中都有效的不同语法会更安全、更清晰,并且在两种上下文中都执行相同的操作:
db<>fiddle 的演示
create table output1 as select x from table1;