如何在条件不满足时阻止oracle触发器执行
我根据审批级别创建了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。 另外,这种方法是非常静态的,我正在寻找动态的解决方案,但目前需要对批准级别进行硬编码如何在条件不满足时阻止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'
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个批准人,我需要创建第四个触发器(遗憾的是,现在是这样),那么我可以在所有触发器中添加此条件?很抱歉问了一个愚蠢的问题,但我害怕触发器!当然,在处理异常时没有问题。