PL / SQL ссылается на другой курсор в курсоре? - PullRequest
2 голосов
/ 02 апреля 2012

Я хотел бы создать процедуру, которая выбирает все записи, которые были назначены для любого конкретного пользователя, а затем отправлять одно персонализированное электронное письмо каждому назначенному пользователю, который содержит список записей, которые ему назначены.

Так что, если myTable выглядит так:

ID    Assigned
1     Joe
2     Joe
3     Shelly

В электронном письме Джо будет отображаться список с разделителями строк с записями 1 и 2, а в письме Шелли будет отображаться запись 3.

Сначала я начал строить процедуру с курсорами, но 1) не был уверен, смогу ли я ссылаться на курсор внутри другого курсора, и 2) не знаю, является ли курсор даже лучшим подходом для этого.

Я думал, что курсор 1 получит все уникальные присвоенные значения (Джо, Шелли), а курсор 2 будет выполнен внутри цикла курсора 1 и получит все записи, назначенные текущему значению курсора 1.

Буду очень признателен за любое понимание или подталкивание в соответствующем направлении.

1 Ответ

5 голосов
/ 03 апреля 2012

Можно ссылаться на другой курсор внутри первого:

declare
  cursor c1 is
    select distinct Assigned from table_name;

  cursor c2(p_Assigned in varchar2) is
    select id, Assigned from table_name where Assigned = p_Assigned;
begin

  for r1 in c1 loop
    dbms_output.put_line('------- start mail --------');
    for r2 in c2(r1.Assigned) loop
      dbms_output.put_line(r2.id || ' ' || r2.Assigned);
    end loop;
    dbms_output.put_line('------- end mail -------');
  end loop;
end; 

Но вы можете сделать лучше, зависит от вашей версии.
Вы можете объединить записи, так что в одном запросе вы будетеполучить одну запись для каждого пользователя со столбцом, который содержит записи, объединенные с newline:
здесь - некоторые методы для этого.
И вы также можете использовать xmlagg:

SELECT Assigned, rtrim(XMLAGG(xmlelement(e, id || ' ' || Assigned || chr(13)|| chr(10) )).extract('//text()'))
FROM table_name
GROUP BY Assigned
...