尽管不满足条件,如何停止执行 oracle 触发器
How to stop oracle trigger from executing despite condition not satisfied
我已经根据批准创建了 3 个触发器 levels.Tables-> p_it_people,p_it_issues,p_it_Departments
1 个部门有 2 个审批人 -> p_it_people.approver='Approver 1' 和 p_it_people.approval_level='Approver 2'
另外 p_it_departments.approval_status=2(对于 2 个批准人)
第一个触发器通过设置 p_it_issues.approve_This=Y1'' 向 p_it_people.approver='Approver 1' 发送电子邮件以批准问题
然后审批人1登录applicationn,设置approve_this='Y1'
第二个触发器触发,当 approve_this='Y1'(前提条件)时,设置 p_it_issues.approved=1 并发送电子邮件至 p_it_people.approver='Approver 2'
现在,当批准者 2 登录并设置 approve_this='Y2'--这应该触发第三个触发器。
但是它在应用程序页面上抛出没有发现数据异常。
没有 Approver 3,但我也不希望触发器在找不到 Approver 3 时执行,***只是更新 p_it_issues.approved=2。
P.S。该方法是非常静态的,我正在寻找动态解决方案,但目前这需要完成硬编码批准级别。
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;
如果我没理解错的话,如果触发的是第三个触发器 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 个触发器 levels.Tables-> p_it_people,p_it_issues,p_it_Departments 1 个部门有 2 个审批人 -> p_it_people.approver='Approver 1' 和 p_it_people.approval_level='Approver 2' 另外 p_it_departments.approval_status=2(对于 2 个批准人)
第一个触发器通过设置 p_it_issues.approve_This=Y1'' 向 p_it_people.approver='Approver 1' 发送电子邮件以批准问题 然后审批人1登录applicationn,设置approve_this='Y1'
第二个触发器触发,当 approve_this='Y1'(前提条件)时,设置 p_it_issues.approved=1 并发送电子邮件至 p_it_people.approver='Approver 2' 现在,当批准者 2 登录并设置 approve_this='Y2'--这应该触发第三个触发器。 但是它在应用程序页面上抛出没有发现数据异常。 没有 Approver 3,但我也不希望触发器在找不到 Approver 3 时执行,***只是更新 p_it_issues.approved=2。
P.S。该方法是非常静态的,我正在寻找动态解决方案,但目前这需要完成硬编码批准级别。
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;
如果我没理解错的话,如果触发的是第三个触发器 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;