2016-09-13 7 views
0

PostgreSQL Я новичок в PostgreSQL, и получить задачу о вложенной loop.Here мой код:вложенного цикла курсор в

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 может делать то, что я хочу сделать, но я просто смущен тем, почему вложенный курсорный цикл в моем коде не будет работать.

+0

Почему вы собираете все эти идентификаторы в одной большой разделенной запятой строке? Это не имеет смысла (по крайней мере для меня). Что вы пытаетесь сделать с этими идентификаторами? –

+0

@a_horse_with_no_name Я запускаю этот код только для pratice, и то, что я хочу знать, это то, как использовать вложенный контур курсора в postgesql. –

+1

Ваш пример неполный. 'ref_User' и' ref_Event' не объявлены нигде. Не могли бы вы отправить полный код и полное сообщение об ошибке, пожалуйста? –

ответ

1

Для этого вам не нужна функция или курсор. Один оператор SQL будет делать:

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

Думает о вашем ответе. String_agg работает, но почему он не будет работать при использовании вложенного курсора в postgresql? –

+0

Что я хочу знать, как заставить этот код работать, любое предложение? –

+0

Привет, я обновляю вопрос и вставляю полный код. –

Смежные вопросы