简体   繁体   English

在插入或更新之前,触发器函数未在 Oracle pl/sql 中执行

[英]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 表中。

  • department_id : department for which manager is getting assigned or getting modified department_id : 为其分配或修改经理的部门
  • manager_id : employee_id who is being assigned as manager manager_id : 被分配为经理的employee_id
  • start_date : date on which manager is getting assigned for a department start_date : 经理被分配到部门的日期
  • end_date: end_date of manager (when a manager is assigned the end_date will be null) end_date:经理的结束日期(当经理被分配时,结束日期将为空)
  • user_name: name of database user who is doing this modification user_name:进行此修改的数据库用户的名称

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM