#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;
Отвечает ли такой ответ на ваш вопрос или я полностью пропустил суть?