【问题标题】:PL/SQL referencing another cursor in a cursor?PL/SQL 在游标中引用另一个游标?
【发布时间】:2012-04-02 19:51:12
【问题描述】:

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

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

ID    Assigned
1     Joe
2     Joe
3     Shelly

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

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

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

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

【问题讨论】:

    标签: plsql cursor


    【解决方案1】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 2012-04-28
      相关资源
      最近更新 更多