Oracle数据库触发器编译问题

时间:2013-10-10 23:15:59

标签: sql database oracle triggers compiler-errors

我正在努力使它成为我创建的数据库可以适应变化。我有一个员工表,其中每一行都有一个员工中另一行的外键(这表示每个员工的经理是谁)。我想要做的就是这样做,当我完成交换两个员工职位的交易时,外键在交易后具有正确的值。

例如,如果我们有:

ID | jobTitle | fk
1    superboss  1
2    boss       1
3    lessboss   2
4    notboss    3

我们在一次交易中交换了notboss和更少boss的职位和外键,我们希望结束表看起来像这样:

ID | jobTitle | fk
1    superboss  1
2    lessboss   3
3    boss       1
4    notboss    2

我实现这些更改的方法是创建一个触发器,当jobTitle更新时触发。它将找到具有前一个外键的所有行,并将其更改为具有旧值jobTitle的行中的fk的值。出于某种原因,我在CREATE TRIGGER上遇到了编译错误。我在下面发布了我的代码。

CREATE TABLE EmployeeB
(
    employeeID integer,
    firstName varchar (255),
    lastName varchar (255),
    phone integer,
    jobTitle varchar (255),
    payGrade integer,
    fk_EmployeeemployeeID integer,
    PRIMARY KEY(employeeID),
    FOREIGN KEY(fk_EmployeeemployeeID) REFERENCES EmployeeB (employeeID) 
ON DELETE SET CASCADE
);

CREATE OR REPLACE TRIGGER ManagerTrigger1A
AFTER UPDATE OF jobTitle ON employeeB 
REFERENCING OLD AS OldRow NEW AS NewRow  
BEGIN
UPDATE employeeB SET FK_EMPLOYEEEMPLOYEEID = (SELECT employeeID FROM employeeB WHERE jobTitle = :OldRow.jobTitle AND rownum <2) 
WHERE (SELECT employeeID FROM employeeB WHERE jobTitle = :OldRow.jobTitle) != null;
END;

CREATE OR REPLACE TRIGGER ManagerTrigger1B
AFTER UPDATE OF jobTitle ON employeeB 
REFERENCING OLD AS OldRow NEW AS NewRow  
BEGIN
DELETE FROM employeeB WHERE (SELECT employeeID FROM employeeB WHERE jobTitle = :OldRow.jobTitle) = null;
END;

我不确定这是否是解决我问题的最佳方法,所以如果我以错误的方式解决这个问题,或者你有更好的想法让我知道。无论哪种方式,我仍然想知道为什么我得到这个编译错误。

编辑:忘记我得到的错误。

Error starting at line 1 in command:
CREATE OR REPLACE TRIGGER ManagerTrigger1A
AFTER UPDATE OF jobTitle ON employeeB 
REFERENCING OLD AS OldRow NEW AS NewRow  
BEGIN
UPDATE employeeB SET FK_EMPLOYEEEMPLOYEEID = (SELECT employeeID FROM employeeB WHERE jobTitle = :OldRow.jobTitle AND rownum <2) 
WHERE (SELECT employeeID FROM employeeB WHERE jobTitle = :OldRow.jobTitle) != null;
END;
Error report:
ORA-04082: NEW or OLD references not allowed in table level triggers
04082. 00000 -  "NEW or OLD references not allowed in table level triggers"
*Cause:    The trigger is accessing "new" or "old" values in a table trigger.
*Action:   Remove any new or old references.

编译错误:

Error(2,1): PL/SQL: SQL Statement ignored
Error(2,97): PL/SQL: ORA-00904: "OLD"."MANAGER"."JOBTITLE": invalid identifier

1 个答案:

答案 0 :(得分:0)

如果没有看到错误,很难解决,但你可以尝试:

UPDATE employeeB SET FK_EMPLOYEEEMPLOYEEID = (SELECT employeeID FROM employeeB WHERE jobTitle = :OldRow.jobTitle AND rownum <2) 
WHERE EXISTS (SELECT employeeID FROM employeeB WHERE jobTitle = :OldRow.jobTitle);

DELETE FROM employeeB WHERE NOT EXISTS (SELECT employeeID FROM employeeB WHERE jobTitle = :OldRow.jobTitle);