PL / SQL触发器包含两个现有表和一个空表

时间:2016-08-14 00:00:35

标签: database oracle plsql triggers runtime-error

我正在尝试编写一个触发器,它将从两个已存在的表员工和部门插入到空表中的employeeID,employeeName,旧部门,新部门和生效日期。我必须从department表中检索该部门名称。我从oracle得到了一个“错误的绑定变量”错误,我不知道我要修复什么:

   CREATE OR REPLACE TRIGGER emp_dept_change_trg
   AFTER INSERT OR UPDATE ON EMPLOYEE
   FOR EACH ROW

   DECLARE
   v_dept DEPARTMENT.DEPARTMENT_NAME%TYPE;

   BEGIN

    SELECT DEPARTMENT_NAME
         INTO v_dept
         FROM DEPARTMENT
         WHERE DEPARTMENT_ID = :NEW.DEPARTMENT_ID;

   IF INSERTING THEN
         INSERT INTO emp_dept_change
         VALUES(:NEW.EMPLOYEE_ID, :NEW.EMPLOYEE_NAME, '[New Hire]',:NEW.DEPARTMENT_NAME ,SYSDATE);

   ELSIF UPDATING THEN

  IF :OLD.DEPARTMENT_ID != :NEW.DEPARTMENT_ID THEN
  INSERT INTO emp_dept_change
  VALUES(:OLD.EMPLOYEE_ID, :OLD.EMPLOYEE_NAME, :OLD.DEPARTMENT_NAME, :NEW.DEPARTMENT_NAME ,SYSDATE);    


   END IF;      
   END IF;
   END;

我也遵循逻辑步骤:

编写一个触发器emp_dept_change_trg,监视employee表,如下所示。

当一个行(记录)插入到employee表中时,触发器会在任何情况下自动将一行(记录)插入到emp_dept_change表中。

OLD_DEPARTMENT_NAME始终为'[New Hire]'。

根据新的department_id从部门表中查找新的部门名称。

如果新的department_id为NULL,则NEW_DEPARTMENT_NAME将为'[-----]'。

当员工更改他/她的部门(旧的department_id不等于新的department_id)时,触发器会自动在emp_dept_change表中插入一行(记录)。 (如果旧的department_id和new department_id都为NULL(从NULL部门到NULL部门),则触发器不会在emp_dept_change表中插入行(记录)。)

根据旧的department_id从部门表中查找旧的部门名称。

如果旧的department_id为NULL,则OLD_DEPARTMENT_NAME将为'[-----]'。

根据新的department_id从部门表中查找新的部门名称。

如果新的department_id为NULL,则NEW_DEPARTMENT_NAME将为'[-----]'。

SYSDATE可以在EFFECTIVE_DATE列中使用。

您可以假设插入/更新语句不违反部门和员工表之间的完整性约束。

触发器中不允许使用临时表/视图/过程/函数。

您只能在触发器中使用department,employee和emp_dept_change表。

0 个答案:

没有答案