PL / SQL引用游标中的另一个游标?

use*_*rew 2 plsql cursor

我想创建一个过程,该过程选择已分配给任何特定用户的所有记录,然后向每个分配的用户发送一封个性化电子邮件,其中包含分配给他们的记录的列表。

因此,如果myTable看起来像这样:

ID    Assigned
1     Joe
2     Joe
3     Shelly
Run Code Online (Sandbox Code Playgroud)

Joe的电子邮件将显示一个以行分隔的列表,其中包含记录1和2,而Shelly的电子邮件将显示记录3。

我首先开始使用游标构建过程,但是1)不确定我是否可以在另一个游标中引用游标,以及2)不知道游标是否甚至是最佳方法。

我的想法是,游标1将获取所有唯一的已分配值(Joe,Shelly),而游标2将在游标1循环内执行,并获取分配给当前游标1值的所有记录。

任何在适当方向上的见识或推动将不胜感激。

A.B*_*ade 5

可以在第一个游标中引用另一个游标:

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; 
Run Code Online (Sandbox Code Playgroud)

但是您可以做得更好,取决于您的版本。
您可以汇总记录,以便在一个查询中为每个用户获得一个记录,该记录的一列包含用newline:串联的记录,
是一些方法。
您还可以使用xmlagg:

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