Oracle PL / SQL отправляет пользователю уведомление по электронной почте об изменении данных - PullRequest
0 голосов
/ 22 октября 2018

У меня есть процесс массовой загрузки данных, посредством которого я загружаю данные в таблицу под названием TICKETS .Ниже приведена структура таблицы с фиктивными данными:

+----------+---------------+--------------+
| TicketID |     Email     | Payment_Hold |
+----------+---------------+--------------+
|        1 | smith@abc.com | YES          |
|        2 | john@abc.com  | NO           |
|        3 | mary@abc.com  | YES          |
|        4 | jane@abc.com  | YES          |
|        5 | king@abc.com  | NO           |
+----------+---------------+--------------+

После процесса загрузки данные в нескольких строках изменяются, либо вставляются новые строки, либо обновляются существующие строки.Ниже приведен снимок данных после загрузки:

+----------+---------------+--------------+
| TicketID |     Email     | Payment_Hold |
+----------+---------------+--------------+
|        1 | blake@abc.com | YES          |
|        2 | john@abc.com  | YES          |
|        4 | jane@abc.com  | NO           |
|        5 | scott@abc.com | NO           |
|        6 | jim@abc.com   | YES          |
+----------+---------------+--------------+

С учетом вышесказанного я пытаюсь отправлять уведомления сотруднику, работающему с тикетом, при изменении данных в двух столбцах, т. Е.

  1. Для определенного идентификатора TicketID, если лицо изменилось и если у билета есть задержка платежа, отправьте уведомление новому человеку, работающему с билетом, и
  2. Если задержка платежа по TicketID изменилась, отправьте уведомление человеку, работающему сticket.

Лучший из возможных способов достижения этой цели - создание таблицы аудита на основе значений и триггера (после вставки или обновления) для таблицы TICKETS для регистрации изменений.Ниже приведен TICKETS_AUDIT_TABLE

+-----+----------+---------------+---------------+------------------+------------------+
| ID  | TicketID |   Old Email   |   New Email   | Old_Payment_Hold | New_Payment_Hold |
+-----+----------+---------------+---------------+------------------+------------------+
| 100 |        1 | smith@abc.com | blake@abc.com | YES              | YES              |
| 200 |        2 | john@abc.com  | john@abc.com  | NO               | YES              |
| 300 |        4 | jane@abc.com  | jane@abc.com  | YES              | NO               |
| 400 |        5 | king@abc.com  | scott@abc.com | NO               | NO               |
| 500 |        6 | NULL          | jim@abc.com   | NULL             | YES              |
+-----+----------+---------------+---------------+------------------+------------------+

А для электронной почты я использую ниже код pl / sql:

DECLARE 
    vemailbody CLOB := NULL; 
    CURSOR c1 IS 
      SELECT * 
      FROM   tickets_audit_table 
      ORDER  BY id; 
BEGIN 
    wwv_flow_api.set_security_group_id; 

    vemailbody := vemailbody 
                  || '<table><tr><th>Ticket Update</th></tr><tr> 
              <th><b>Ticket ID</b></th> 
              <th>Old Email</th> 
              <th>New Email</th> 
              <th>Old Payment Hold Flag</th> 
              <th>New Payment Hold Flag</th> </tr>'; 

    FOR rec IN c1 LOOP 

        vemailbody := vemailbody || '<tr> <td>' || rec.ticketid 
                             ||'</td> <td>' || rec.old_email 
                             ||'</td> <td>' || rec.new_email 
                             ||'</td> <td>' || rec.old_payment_hold 
                             ||'</td> <td>' || rec.new_payment_hold 
                             ||'</td> </tr>'|| utl_tcp.crlf; 
    END LOOP; 

    vemailbody := vemailbody || '</table>' || utl_tcp.crlf; 
    vemailbody := vemailbody || '<br>' || utl_tcp.crlf; 
    vemailbody := vemailbody || '</td>'|| utl_tcp.crlf; 
    vemailbody := vemailbody || '</tr>'|| utl_tcp.crlf; 
    vemailbody := vemailbody || '</table>'|| utl_tcp.crlf; 

    dbms_output.Put_line(vemailbody); 

    apex_mail.Send(p_to => 'richa@abc.com', 
                   p_from => 'Test Mail <test@abc.com>',
               p_subj => 'Ticket update',
           p_body => vemailbody, 
           p_body_html => vemailbody); 

    apex_mail.push_queue; 
END; 

Проблема здесь в том, что электронная почта запущенанесколько раз для пользователей, которые ранее получили письмо.Я не уверен, как отправить уведомление по электронной почте на основании следующих условий: Например: с учетом идентификатора билета = 1

  • Если (Old_Email не равно New_Email) AND (Old_Payment_Hold не равно New_Payment_Hold), то отправьте письмотолько на New_Email
  • Если электронное письмо уже отправлено для билета с идентификатором = 1, где (New_Email = Old_Email) и (Old_Payment_Hold = New_Payment_Hold), то не отправлять электронную почту.

Я действительно ценюлюбая помощь по этому поводу.

Спасибо,
Рича

...