在 Postresql 的块中使用“select into”和“Select”语句

问题描述 投票:0回答:1

我看到一些

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; 
                      ^

小提琴

我收到这些错误消息的原因是什么?

sql postgresql plpgsql
1个回答
0
投票

我猜您的期望是 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;
© www.soinside.com 2019 - 2024. All rights reserved.