Oracle PL / SQL. Передать вывод петли почтового адреса в процедуру электронной почты оракула - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть процедура, которая отправляет почту. Я хочу отправить письмо, выбрав адреса электронной почты в представлении, и передать их моей процедуре.

Этот код работает так, что он выводит несколько адресов электронной почты и номера инцидентов из моей базы данных.

create or replace procedure SEND_REMINDER_MAIL as

CURSOR c1 IS
SELECT contact_email
 FROM TEST.incidents_view
WHERE updated <= current_timestamp - interval '1' minute
and status_code = '100';

cursor c2 is
SELECT incident_number
FROM TEST.incidents_view WHERE updated <= current_timestamp - interval '1' minute
and status_code = '100';

v_contact_email varchar2(300);
v_incno VARCHAR2(10);

BEGIN
   -- Open the cursor and loop through the records
   OPEN c1;

      FETCH c1 INTO v_contact_email;
      EXIT WHEN c1%NOTFOUND;
      -- Print  values
      dbms_output.put_line(v_contact_email);
  end loop;
      CLOSE c1;

   open c2;
LOOP
   fetch c2 into v_incno;
   EXIT WHEN c2%NOTFOUND;
dbms_output.put_line(v_incno);
   end loop;
    CLOSE c2;
end;

/

Что мне нужно сделать, так это передать только адреса электронной почты в существующую процедуру электронной почты, чтобы отправлять электронные письма всем, кто появляется в списке, сгенерированном в результате.

Это следующая часть процедуры, я использовал dbms_output для проверки и проверки того, что адреса электронной почты генерируются правильно и передаются в v_contact_email. Теперь, когда я пытаюсь отправить письмо, передается только один адрес:

send_mail.send(
ToList=>             v_contact_email,
Subject=>            'Ticket closing warning.',
Body=>               'Please note, your ticket '|| v_incno ||' will be subject to automatic closure',
FromEmail=>          'donotreply@test.com.au',
FromHost=>           'emailsrv',
SMTPServer=>         'emailsrv',);
close c1;
close c2;
End;
/

Он не отправляет несколько писем, которые, как показано, правильно передаются в v_contact_email. Он просто отправляет одно электронное письмо и ничего больше.

Почему несколько адресов электронной почты, зацикленных на v_contact_email, не приводят к отправке нескольких писем вместо одного?

Как я могу это исправить так:

send_mail.send(
ToList=>             v_contact_email,
Subject=>            'Ticket closing warning.',
Body=>               'Please note, your ticket '|| v_incno ||' will be subject to automatic closure',
FromEmail=>          'donotreply@test.com.au',
FromHost=>           'emailsrv',
SMTPServer=>         'emailsrv',);
close c1;
close c2;
End;
/

Часть кода правильно перебирает полный набор результатов? Вместо того, чтобы просто получить один адрес и запустить одно электронное письмо, прежде чем больше ничего не делать?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

После вашей помощи Littlefoot, это то, что я придумал, и сделал именно то, что хотел.

create or replace procedure SEND_MAIL_REMINDER as
    begin
      for cur_r in (SELECT customer_email, incident_number
    FROM incidents_view
    WHERE updated <= current_timestamp - interval '24' hour
    and status = '20') loop
    send_mail.send(
    ToList=>             cur_r.customer_email,
    Subject=>            'Ticket Closure Warning.',
    Body=>               'Please note, your ticket '|| cur_r.incident_number ||' has been in status 20 for some time.',
    FromEmail=>          'donotreply@blah.com',
    FromHost=>           'mailsrv',
    SMTPServer=>         'mailsrv',
    AttachList=>         '',
    Directory=>          '');
    end loop;
    end;
    /
0 голосов
/ 07 ноября 2018

Первый код, который вы опубликовали, не совсем корректен; это первый курсор не хватает LOOP. Если вы исправите это, результат будет:

  • куча адресов электронной почты
  • куча номеров инцидентов

Первый цикл выбирает адреса электронной почты, поэтому v_contact_email содержит только последний выбранный адрес. То же самое касается номеров инцидентов.

Одним из вариантов является то, что вы хотите вкладывать эти циклы, что-то вроде этого (я использую циклы курсора FOR, так как они проще для поддержки явно объявленных курсоров, которые вы должны объявить ( а также переменные курсора (ов), открытие, цикл, позаботьтесь о выходе из цикла, закройте курсор) - если вы используете курсорный цикл FOR, Oracle сделает большинство этих вещей за вас.

begin
  for cur_r in (select contact_email from incidents_view where ...) loop
    for cur_i in (select incident_number from incidents_view where ...) loop
      send_mail.send(ToList  => cur_r.contact_email,
                     Subject => 'Ticket closing warning.',
                     Body    => 'Please note, your ticket '|| cur_i.incident_number ...
                    );
    end loop;
  end loop;
end;

Но почему у вас два курсора? Они выглядят одинаково (кроме того, что они выбирают), но - FROM предложения равны, WHERE предложения равны ... почему бы не использовать только один курсор? Э.Г.

begin
  for cur_r in (select contact_email, incident_number
                from incidents_view where ...
               ) loop
    send_mail.send(ToList  => cur_r.contact_email,
                   Subject => 'Ticket closing warning.',
                   Body    => 'Please note, your ticket '|| cur_r.incident_number ...
                  );
  end loop;
end;
...