如何在postgresql中编写返回表的非参数化函数

如何在postgresql中编写返回表的非参数化函数,postgresql,Postgresql,demowhile_uu返回表id integer,name varchar50基本上与demowhile_uout id integer相同,out name varchar50返回setof record id输出列可以直接从函数中引用。然后,您还创建了一个名为id的函数变量。因此,当您为id赋值时,是为输出参数赋值还是为声明的变量赋值?PG不知道,所以你得到了那个错误 当然,简单的解决方案是为每个变量指定一个唯一的名称。只需重命名变量id=select top1 id from temp;

demowhile_uu返回表id integer,name varchar50基本上与demowhile_uout id integer相同,out name varchar50返回setof record

id输出列可以直接从函数中引用。然后,您还创建了一个名为id的函数变量。因此,当您为id赋值时,是为输出参数赋值还是为声明的变量赋值?PG不知道,所以你得到了那个错误


当然,简单的解决方案是为每个变量指定一个唯一的名称。

只需重命名变量id=select top1 id from temp;例如,在所有你真正想使用它的地方,选择top1对Postgres来说都是无效的。整个方法似乎不必要地复杂。据我所知,这可以通过一条简单的SQL语句来完成。没有循环,没有top,没有PL/pgSQL——特别是因为在最后,您只返回演示表的内容,而这些内容并没有因为循环中低效且缓慢的逐行处理而改变。你想用它解决的真正问题是什么?
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**