postgresql - 如何编写在postgresql中返回表的非参数化函数
问题描述
create or replace function demowhile_()
returns table (id integer,name varchar(50))
language 'plpgsql'
as $$
declare id integer;
declare name varchar(50);
begin
CREATE temporary TABLE demo_(id integer,name varchar(50));
CREATE temporary TABLE temp_ (id integer);
insert into temp_ (select id from demo);
while (select count(*) from temp_) <> 0
loop
id = (select top(1) id from temp_);
name = (select name from demo where id = id);
insert into demo_ values (id,name);
delete from temp_ where id = id;
end loop;
return query select id,name from demo;
end;
$$;
****在执行时出现错误,如****
select * from demowhile();
**ERROR: column reference "id" is ambiguous
LINE 1: insert into temp_ (select id,name from demo)
^
DETAIL: It could refer to either a PL/pgSQL variable or a table column.
QUERY: insert into temp_ (select id,name from demo)
CONTEXT: PL/pgSQL function demowhile() line 9 at SQL statement
SQL state: 42702**
解决方案
demowhile_() returns table (id integer,name varchar(50)
基本上是一样的demowhile_(out id integer, out name varchar(50)) returns setof record
输出列id
可以直接从函数内部引用。然后,您还创建了一个名为 的函数变量id
。因此,当您为 赋值时id
,您是分配给输出参数还是声明的变量?PG 不知道,所以你得到那个错误。
当然,简单的解决方案是给每个人一个唯一的名称。
推荐阅读
- python - 为什么我的神经网络为 XOR 门输出相同的 0.5 输出?
- angular8 - 在 Ag-Grid 函数中没有调用
- r - 在堆叠的 ggplot2 图上设置自定义标签
- ios - 显示屏幕时如何移动到幻灯片
- windows - OpenSSL NMAKE 未解析的外部符号
- javascript - 如何使用选择选项在javascript中制作动态表格列
- terraform - 创建 IAM 角色并将策略附加到该角色时出错
- nginx - Nginx proxy_set_header 未添加到 POST 请求的标头中
- matlab - 如何从 MATLAB 中的大型数据集生成 CDF?
- swift - Swift 5:'substring(to:)' 已被弃用