【问题标题】:Using a cursor throughout a procedure在整个过程中使用游标
【发布时间】:2011-10-04 13:57:48
【问题描述】:

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

【问题讨论】:

  • 您是否检查过UTL_MAIL.SEND 的参数值?您是否尝试过使用硬编码参数发送带有 UTL_MAIL 的邮件?
  • 是的,我有,而且效果很好。如果我对所有电子邮件变量(包括收件人)进行硬编码,它就可以正常工作。它只是能够使用该变量 (v_id),并使用它获取所有 25 条记录

标签: sql oracle plsql cursor


【解决方案1】:

据我了解,您的光标位于 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;

这种回答是你的问题还是我完全没有抓住重点?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多