2011-10-04 62 views
0

我對PL/SQL有點新,並且在創建遊標時遇到了一些麻煩。我正在編寫一個向特定人員發送電子郵件的程序。下面是相關代碼:在整個過程中使用遊標

sql stmt := ' -- All my sql is in here -- '; 

open email_cursor for sql stmt; 
fetch email_cursor into term, award, desc, id, name, xmdt; 

..... 


if v_id is not null then 
    email_adr := schema1.get_email_adr(v_id); --This is partly where problem is. 

    if v_opt_ltr = 'Y' then  --a variable that decides if an email should be sent 

        UTL_MAIL.SEND (sender => email_from, 
         recipients => email_adr, 
         subject => v_email_subject, 
         mime_type => 'text/html', 
         message => email_body); 

    END IF; 

END IF; 

好了,所以我沒有得到任何錯誤或任何東西,當我運行它,但由於某些原因,當我運行失敗的email_adr變量的函數,而犯規給我任何東西,並反過來不會發送電子郵件。另一個問題(因爲我是遊標的新手):如果我運行「stu_email:= schema1.get_email_adr(v_id);」遊標中的v_id應該有大約25條記錄,這會給我所有25條記錄,然後「utl_mail.send」會發送一封電子郵件給所有的收件人嗎?

+0

您是否看過參數值爲UTL_MAIL.SEND?您是否嘗試使用硬編碼參數發送包含UTL_MAIL的郵件? –

+0

是的,我有,它工作正常。如果我硬編碼所有的電子郵件變量(包括收件人),它工作正常。它只是能夠使用該變量(v_id),並獲得所有25條記錄 – Dan

回答

0

據我所知,你的光標在get_email_adr函數裏面,對嗎?雖然這些變量看起來都不像電子郵件地址,但我有點困惑。

如果是這樣,那麼這一切都取決於get_email_adr函數內的代碼如何工作。每當你用光標「重置」它。所以如果你想合併所有25條記錄,你需要爲它提供一些代碼。像這樣的事情:

FUNCTION get_email_adr(f_id IN NUMBER) RETURN VARCHAR2 IS 
    result VARCHAR2(32000); 
    CURSOR cur_email (c_id IN NUMBER) IS 
     SELECT email_address FROM some_table WHERE id = c_id; 
BEGIN 
    FOR rec IN cur_email(f_id) 
    LOOP 
     IF(result IS NULL) 
     THEN 
      result := rec.email_address; 
     ELSE 
      result := result || ',' || rec.email_address; 
     END IF; 
    END LOOP; 
    RETURN result; 
END get_email_adr; 

這樣的回答你質疑還是我完全錯過了這一點?