2012-04-02 68 views
3

我想創建一個過程,選擇已分配給任何特定用戶的所有記錄,然後向包含分配給他們的記錄列表的每個指定用戶發送一封個性化電子郵件。PL/SQL引用遊標中的另一個遊標?

所以,如果myTable的是這樣的:

ID Assigned 
1  Joe 
2  Joe 
3  Shelly 

喬的電子郵件將顯示與記錄1和其2線分隔的列表,雪萊的將顯示記錄3.

我開始建設但是1)不確定是否可以在另一個遊標中引用遊標,以及2)不知道遊標是否是最好的方法。

我的想法是光標1會得到所有唯一賦值(Joe,Shelly),並且光標2將在光標1循環內部執行並獲取指定給當前光標1值的所有記錄。

任何洞察力或適當的方向微調將不勝感激。

回答

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; 

但是你可以做的更好,deppends您的版本。
您可以彙總記錄,因此在一個查詢中,您將獲得每個用戶的一條記錄,其中包含與newline連接的記錄的列:
是對此的一些方法。
而且你還可以使用XMLAGG:

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

非常感謝,XMLAGG真是棒極了! – userDrew 2012-04-03 13:13:00