[英]trigger function is not executing in Oracle pl/sql before insert or update
INSERT AND UPDATE STATEMENTS IN ANYNIMOUS BLOCK SI NOT CALLING TRIGGER BEACAUSE ERROR IN MY TRIG CODE PLEASE HELP ME TO SOLVE MY MISTAKE AS I AM NOOB IN TRIGGER CONCEPT......在任何块中插入和更新语句 SI 不调用触发器,因为我的触发器代码中的错误请帮助我解决我的错误,因为我是触发器概念的新手......
Question: HR Manager wants to keep track of all manager details of every department for auditing in the future.问题:HR 经理想要跟踪每个部门的所有经理详细信息,以便将来进行审计。 Whenever an HR Manager assigns a new manager, the following manager details should be recorded in DEPT_MANAGER_LOG table.每当 HR 经理分配新经理时,应将以下经理详细信息记录在 DEPT_MANAGER_LOG 表中。
Whenever an HR Manager changes manager of any department, the end date of previous manager need to be updated and details of new manager need to be inserted in DEPT_MANAGER_LOG table.''' create or replace trigger trg_mgr_log before insert or update of manager_id on departments for each row每当 HR 经理更换任何部门的经理时,需要更新前任经理的结束日期,并且需要在 DEPT_MANAGER_LOG 表中插入新经理的详细信息。''' 在插入或更新部门的 manager_id 之前创建或替换触发器 trg_mgr_log每一行
CODE:代码:
create or replace trigger trg_mgr_log
before insert or update of manager_id on departments
for each row
declare
v_dpid departments.department_id%type ;
v_mgr_id departments.manager_id%type ;
v_start_date JOB_HISTORY.START_DATE%type;
v_end_date JOB_HISTORY.END_DATE%type;
begin
/*v_dpid := :new.department_id;
select manager_id into v_mgr_id from departments where department_id = v_dpid;*/
select START_DATE, END_DATE into v_start_date, v_end_date from job_history where employee_id =
v_mgr_id;
if inserting then
v_dpid := :new.department_id;
select manager_id into v_mgr_id from departments where department_id = v_dpid;
if(v_mgr_id is null) then
insert into DEPT_MANAGER_LOG values (v_dpid, :new.manager_id,SYSTIMESTAMP,null,user);
end if;
elsif updating then
v_dpid := :OLD.department_id;
select manager_id into v_mgr_id from departments where department_id = v_dpid;
if(v_mgr_id is not null) then
insert into DEPT_MANAGER_LOG values (v_dpid, :old.manager_id,v_start_date,SYSTIMESTAMP,user);
insert into DEPT_MANAGER_LOG values (v_dpid, :new.manager_id,SYSTIMESTAMP,null,user);
end if;
end if;
end; '
You may be getting a "mutating table" error, because you're selecting from the same table that the trigger is defined on.您可能会收到“mutating table”错误,因为您是从定义触发器的同一个表中选择的。 The following should fix that issue:以下应解决该问题:
create or replace trigger trg_mgr_log
before insert or update of manager_id on departments
for each row
begin
if inserting and
:new.manager_id is null
then
insert into DEPT_MANAGER_LOG values (:new.department_id, :new.manager_id, SYSTIMESTAMP, null, user);
elsif updating and
:OLD.manager_id is not null
then
declare
v_start_date JOB_HISTORY.START_DATE%type;
begin
select START_DATE
into v_start_date
from job_history
where employee_id = :new.manager_id;
insert into DEPT_MANAGER_LOG values (:OLD.department_id, :old.manager_id, v_start_date, SYSTIMESTAMP, user);
insert into DEPT_MANAGER_LOG values (:OLD.department_id, :new.manager_id, SYSTIMESTAMP, null, user);
end;
end if;
end;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.