在整个过程中使用游标

时间:2011-10-04 13:57:49

标签: sql oracle plsql cursor

我对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”会向所有收件人发送电子邮件吗?

1 个答案:

答案 0 :(得分:0)

据我了解,你的光标位于get_email_adr函数内,是吗?虽然这些变量看起来都不像电子邮件地址,所以我有点困惑。

如果是这样,那么一切都取决于get_email_adr函数中的代码如何工作。每次open光标时,它都会“重置”它。因此,如果您想要组合所有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;

你回答这个问题或者我完全错过了这个问题吗?