【问题标题】:nested cursor loop in postgresqlpostgresql中的嵌套游标循环
【发布时间】:2016-09-13 09:05:42
【问题描述】:

我是 postgresql 新手,遇到了关于嵌套循环的问题。这是我的代码:

CREATE TABLE q_39442172
(
   id character varying,
   event_id character varying,
   createdat character varying
);


insert into q_39442172 values('id1', 'event_1', '20160789');
insert into q_39442172 values('id2', 'event_2', '20160689');
insert into q_39442172 values('id3', 'event_3', '20160679');
insert into q_39442172 values('id4', 'event_4', '20160579');
insert into q_39442172 values('id3', 'event_3', '20160579');
insert into q_39442172 values('id2', 'event_5', '20160379');
insert into q_39442172 values('id1', 'event_6', '20160339');


create or replace function query_event_sequence() returns table( r_id character varying, r_events text ) as
$$
declare
    vc_id            character varying;
    vc_event_id      character varying;
begin
    for ref_User in execute 'select distinct id from q_39442172 order by id' loop
        vc_id   := ref_User.id;
        r_id    := ref_User.id;

        for ref_Event in execute 'select event_id from q_39442172 where id = ' || vc_id loop
            vc_event_id := ref_Event.event_id;
            r_events    := concat_ws( ',', r_events, vc_event_id );
        end loop;

        raise notice '%: %', r_id, r_events;
        return next;
    end loop;
end;
$$
language plpgsql;

我得到的异常:

NOTICE:  id1: event_6,event_1
ERROR:  cursor "<unnamed portal 2>" already in use
CONTEXT:  PL/pgSQL function query_event_sequence() line 13 at OPEN
********** Error **********

ERROR: cursor "<unnamed portal 2>" already in use
SQL state: 42P03

实际上,使用 array_agg 可以做我想做的事,但我只是对为什么我的代码中的嵌套游标循环不起作用感到困惑。

【问题讨论】:

  • 为什么要将所有这些 ID 收集在一个逗号分隔的大字符串中?这没有意义(至少对我来说)。你想用这些 ID 做什么?
  • @a_horse_with_no_name 我运行这段代码只是为了练习,我想知道的是如何在 postgesql 中使用嵌套游标循环。
  • 您的示例不完整。 ref_Userref_Event 没有在任何地方声明。请把完整的代码和完整的错误信息贴出来好吗?
  • 当我为记录添加缺少的声明时,这对我有用。您在哪里以及如何调用该函数?
  • @LaurenzAlbe 使用带有 for 循环的游标时,不需要声明游标变量。这是完整的代码。

标签: postgresql cursor plpgsql


【解决方案1】:

您不需要函数或光标。一条 SQL 语句就可以了:

select string_agg(concat_ws(',', event_id, id), ',' order by id)
from q_39442172 
where id in (select id from q_39442172)

【讨论】:

  • 想你的答案。 String_agg 确实有效,但为什么在 postgresql 中使用嵌套游标循环时它不起作用?
  • 我想知道的是如何让这段代码工作,有什么建议吗?
猜你喜欢
  • 2017-02-28
  • 1970-01-01
  • 2023-03-25
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-18
  • 2014-12-02
相关资源
最近更新 更多