2011-10-04 60 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; 

这样的回答你质疑还是我完全错过了这一点?