我正在尝试编写一个触发器,它将从两个已存在的表员工和部门插入到空表中的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表。