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 在游标中引用另一个游标?的主要内容,如果未能解决你的问题,请参考以下文章