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

时间:2012-04-02 19:51:12

标签: plsql cursor

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

所以如果myTable看起来像这样:

ID    Assigned
1     Joe
2     Joe
3     Shelly

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

我开始用游标开始构建一个过程,但是1)不确定我是否可以在另一个游标中引用游标,2)不知道游标是否是最好的方法。

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

非常感谢任何有关方向的见解或推动。

1 个答案:

答案 0 :(得分: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; 

但你可以做得更好,取决于你的版本 您可以聚合记录,因此在一个查询中,您将获得每个用户的一条记录,其中一列包含与newline连接的记录:
here是一些方法。
你也可以使用xmlagg:

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