【问题标题】:How to stop oracle trigger from executing despite condition not satisfied尽管条件不满足,如何停止执行 oracle 触发器
【发布时间】:2020-04-29 17:19:57
【问题描述】:

我根据批准级别创建了 3 个触发器。表格-> p_it_people,p_it_issues,p_it_Departments 1 个部门有 2 个审批人 -> p_it_people.approver='审批人 1' 和 p_it_people.approval_level='审批人 2' 还有 p_it_departments.approval_status=2(对于 2 个审批者)

第一个触发器通过设置 p_it_issues.approve_This=Y1'' 向 p_it_people.approver='Approver 1' 发送电子邮件以批准问题 然后 Approver 1 登录到 applicationn 并设置approve_this='Y1'

第二个触发器触发,当approve_this='Y1'(前置条件)时,设置p_it_issues.approved=1 并发送电子邮件到p_it_people.approver='Approver 2' 现在,当 Approver 2 登录并设置approve_this='Y2'--这应该触发第三个触发器。 但是,它在应用程序页面上没有发现数据异常。 没有 Approver 3,但如果没有找到 Approver 3,我也不希望触发器执行,并且 ***只需更新 p_it_issues.approved=2。

附:该方法是非常静态的,我正在寻找动态解决方案,但目前这需要通过硬编码批准级别来完成。

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;

【问题讨论】:

    标签: oracle oracle-apex


    【解决方案1】:

    如果我理解正确,并且如果是第三次触发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;
    

    【讨论】:

    • 如果有另一个部门有 3 个审批者,我需要创建第 4 个触发器(可悲的是现在是这样),那么我可以在所有触发器中添加这个条件吗?很抱歉提出愚蠢的问题,但我害怕触发!
    • 可以,异常处理没问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多