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

Posted

技术标签:

【中文标题】PL/SQL 在游标中引用另一个游标?【英文标题】:PL/SQL referencing another cursor in a cursor? 【发布时间】: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 值的所有记录。

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于PL/SQL 在游标中引用另一个游标?的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 打印出存储过程返回的引用游标

Oracle PL/SQL 引用游标如何

Oracle PL/SQL 将游标(来自函数)中的每个值一一分配给另一个游标

PL/SQL 游标使用参数作为列名

在 PL/SQL 中将游标数据提取到数组中

Oracle PL SQL:比较两个存储过程返回的引用游标结果