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

标签 plsql cursor

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

如果 myTable 看起来像这样:

ID    Assigned
1     Joe
2     Joe
3     Shelly

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

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

我的想法是,游标 1 将获取所有唯一的分配值(Joe、Shelly),而游标 2 将在游标 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; 

但是您可以做得更好,具体取决于您的版本。
您可以聚合记录,以便在一个查询中为每个用户获取一条记录,其中有一列包含用换行符连接的记录:
here有一些方法可以做到这一点。
您还可以使用 xmlagg:

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

关于plsql - PL/SQL 在游标中引用另一个游标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9982883/

相关文章:

oracle - 强制 Oracle 删除全局临时表

oracle - Oracle 中函数的 DETERMINISTIC 和 PARALLEL_ENABLED 之间的区别

android - SQLite 查询后如何处理 Cursor?

Mysql游标无法获取数据

sql - 如何为存储过程参数选择默认值?

sql - 如何在 Oracle 中将 NUMBER 转换为 VARCHAR2?

sql - PL SQL如何选择所有列

sql - 获取当前正在执行的 SQL Cursor 语句

android - 单游标多对多查询不重复数据

c++ - Berkeley DB 和 C++ 的问题