Как остановить выполнение oracle триггера, несмотря на то, что условие не выполнено - PullRequest
0 голосов
/ 29 апреля 2020

Я создал 3 триггера на основе уровней утверждения. Таблицы-> p_it_people, p_it_issues, p_it_Departments Имеется 2 утверждающих для 1 отдела -> p_it_people.approver = 'Approver 1' и p_it_people.approval_level = 'Approver 2' Также p_it_departments. authentication_status = 2 (для 2 утверждающих)

1-й триггер отправляет электронное письмо p_it_people.approver = 'Approver 1', чтобы утвердить проблему, установив p_it_issues.approve_This = Y1 '' Затем утверждающий 1 входит в приложение и устанавливает Approve_this = 'Y1'

2-й триггер срабатывает, когда Approve_this = 'Y1' (предварительное условие), установите p_it_issues.approved = 1 и отправьте письмо на p_it_people.approver = 'Approver 2' Теперь, когда утверждающий 2 регистрируется в и устанавливает Approve_this = 'Y2' - Это должно запустить 3-й триггер. Однако он не выдает исключение для данных на странице приложения. Нет утверждающего 3, но я также не хочу, чтобы триггер вообще выполнялся, если он не находит утверждающего 3 и ***, просто обновите p_it_issues.approved = 2.

PS Подход очень статичен c, и я ищу динамическое решение c, но сейчас это необходимо сделать с жесткими уровнями одобрения кодирования.

Code for Trigger 3:

    CREATE OR REPLACE EDITIONABLE TRIGGER  "P_IT_ISSUES_AIU_Notify_Approver_3" 
    BEFORE 
    update on P_IT_ISSUES
    for each row 
         WHEN (new.APPROVE_THIS ='Y2') declare
    v_person_id number;
    v_email varchar2(255);
    v_dept_name varchar2(50);

    begin
    :new.APPROVED :=2 ;


    select p.person_id ,p.person_email,i.dept_name into v_person_id,v_email,v_Dept_name from p_it_people p,p_it_departments i 
    where p.assigned_dept=i.dept_id and i.dept_id=:new.related_dept_id and p.approver='Approver 3' and i.approval_level!=:new.approved ;

                 APEX_MAIL.SEND( 
                     p_to => v_email, 
                     p_from => v_email, 
                     p_body =>  
                     'You have been assigned a new issue for third level approval.  ' ||chr(10)|| 
                     'The details are below. ' ||chr(10)|| 
                     chr(10)|| 
                     ' Department:'|| v_dept_name ||chr(10)|| 
                     ' Summary: '||:new.issue_summary ||chr(10)|| 
                     ' Status: '||:new.status ||chr(10)|| 
                     'Priority: '||nvl(:new.priority,'-'), 
                      p_subj => 'New Issue for Third Level Approval'); 


    end;

In case required, codes for Trigger 1 and 2 are also below:

Trigger 1:

    CREATE OR REPLACE EDITIONABLE TRIGGER  "P_IT_ISSUES_AIU_Notify_Approver_1" 
    AFTER 
    insert on P_IT_ISSUES 
    for each row 
    FOLLOWS P_IT_ISSUES_AIU_EMAIL
    declare
    v_person_id number;
    v_email varchar2(255);
    v_dept_name varchar2(50);
    begin
    select p.person_id ,p.person_email,i.dept_name into v_person_id,v_email,v_Dept_name from p_it_people p,p_it_departments i 
    where p.assigned_dept=i.dept_id and i.dept_id=:new.related_dept_id and p.approver='Approver 1' and i.approval_level!=:new.approved ;

                 APEX_MAIL.SEND( 
                     p_to => v_email, 
                     p_from => v_email, 
                     p_body =>  
                     'You have been assigned a new issue for first level approval.  ' ||chr(10)|| 
                     'The details are below. ' ||chr(10)|| 
                     chr(10)|| 
                     ' Department:'|| v_dept_name ||chr(10)|| 
                     ' Summary: '||:new.issue_summary ||chr(10)|| 
                     ' Status: '||:new.status ||chr(10)|| 
                     'Priority: '||nvl(:new.priority,'-'), 
                      p_subj => 'New Issue for First Level Approval'); 


    end;

Trigger 2:

CREATE OR REPLACE EDITIONABLE TRIGGER  "P_IT_ISSUES_AIU_Notify_Approver_2" 
BEFORE 
update on P_IT_ISSUES
for each row 
   WHEN (new.APPROVE_THIS ='Y1'  ) declare
v_person_id number;
v_email varchar2(255);
v_dept_name varchar2(50);

begin
:new.APPROVED :=1 ;


select p.person_id ,p.person_email,i.dept_name into v_person_id,v_email,v_Dept_name from p_it_people p,p_it_departments i 
where p.assigned_dept=i.dept_id and i.dept_id=:new.related_dept_id and p.approver='Approver 2'  and i.approval_level!=:new.approved;

             APEX_MAIL.SEND( 
                 p_to => v_email, 
                 p_from => v_email, 
                 p_body =>  
                 'You have been assigned a new issue for second level approval.  ' ||chr(10)|| 
                 'The details are below. ' ||chr(10)|| 
                 chr(10)|| 
                 ' Department:'|| v_dept_name ||chr(10)|| 
                 ' Summary: '||:new.issue_summary ||chr(10)|| 
                 ' Status: '||:new.status ||chr(10)|| 
                 'Priority: '||nvl(:new.priority,'-'), 
                  p_subj => 'New Issue for Second Level Approval'); 


end;

1 Ответ

1 голос
/ 29 апреля 2020

Если я вас правильно понял, и если это 3-й триггер, который вызывает no_data_found, то обработайте его ; см. раздел exception в нижней части триггера.

(...)
begin
  :new.APPROVED :=2;

  select p.person_id, p.person_email, i.dept_name 
    into v_person_id, v_email, v_Dept_name 
  from p_it_people p join p_it_departments i on p.assigned_dept = i.dept_id
  where i.dept_id = :new.related_dept_id 
    and p.approver = 'Approver 3' 
    and i.approval_level != :new.approved;

  APEX_MAIL.SEND(...);

exception
  when no_data_found then 
    -- set APPROVED anyway
    :new.APPROVED :=2;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...