Использование курсора во время процедуры

#sql #oracle #plsql #cursor

#sql #Oracle #plsql #курсор

Вопрос:

Я несколько новичок в 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. Вы ввели значения параметров в UTL_MAIL.SEND? Вы пробовали отправлять почту с помощью UTL_MAIL, используя жестко заданные параметры?

2. да, у меня есть, и это работает нормально. Если я жестко запрограммирую все переменные электронной почты (включая получателя), все будет работать нормально. Это просто возможность использовать эту переменную (v_id) и получить с ее помощью все 25 записей

Ответ №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;
  

Отвечает ли такой ответ на ваш вопрос или я полностью пропустил суть?