Использование курсора на протяжении всей процедуры - PullRequest
0 голосов
/ 04 октября 2011

Я немного новичок в 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, она завершается ошибкой, и ничего не дает мне, и, в свою очередь, не отправляет электронное письмо.

Еще один вопрос (потому что я новичок в курсорах): v_id в курсоре должно иметь около 25 записей, если я запускаю строку "stu_email: = schema1.get_email_adr (v_id);" это даст мне все 25 записей, и затем "utl_mail.send" отправит электронное письмо всем получателям?

1 Ответ

0 голосов
/ 04 октября 2011

Насколько я понимаю, ваш курсор находится внутри функции 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;

На этот вопрос вы отвечаете, или я полностью упустил вопрос?

...