Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在条件不满足时阻止oracle触发器执行_Oracle_Oracle Apex - Fatal编程技术网

如何在条件不满足时阻止oracle触发器执行

如何在条件不满足时阻止oracle触发器执行,oracle,oracle-apex,Oracle,Oracle Apex,我根据审批级别创建了3个触发器。表->p_it_人员、p_it_问题、p_it_部门 1个部门->p_it_人员有2个审批人。审批人='approver 1'和p_it_人员。审批级别='approver 2' 还有p_it_部门。批准_状态=2(对于2个批准者) 第一个触发器向p_it_人员发送电子邮件。approver='approver 1'通过设置p_it_问题来批准问题。approve_This=Y1'' 然后Approver 1登录到应用程序n并设置approve_this='Y1'

我根据审批级别创建了3个触发器。表->p_it_人员、p_it_问题、p_it_部门 1个部门->p_it_人员有2个审批人。审批人='approver 1'和p_it_人员。审批级别='approver 2' 还有p_it_部门。批准_状态=2(对于2个批准者)

第一个触发器向p_it_人员发送电子邮件。approver='approver 1'通过设置p_it_问题来批准问题。approve_This=Y1'' 然后Approver 1登录到应用程序n并设置approve_this='Y1'

第二个触发器触发,当批准this='Y1'(前提条件)时,设置p_it_问题。批准=1并向p_it_人员发送电子邮件。批准人='approver 2' 现在,当Approver 2登录并设置approve_this='Y2'——这将触发第三个触发器。 但是,它在应用程序页面上抛出“找不到数据”异常。 没有Approver 3,但是如果没有找到Approver 3并且***只需更新p\u it\u问题,我也不希望触发器执行。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;

如果我理解正确,并且是第三个触发器引发了
未找到数据
,那么处理它;请参阅触发器底部的
异常部分

(...)
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个批准人,我需要创建第四个触发器(遗憾的是,现在是这样),那么我可以在所有触发器中添加此条件?很抱歉问了一个愚蠢的问题,但我害怕触发器!当然,在处理异常时没有问题。