簡體   English   中英

Oracle數據庫觸發器編譯問題

[英]Oracle Database Trigger compilation issue

我正在嘗試使它能夠使我創建的數據庫適應變化。 我有一個雇員表,其中每一行都有雇員另一行的外鍵(這表示每個雇員的經理是誰)。 我想做的是,這樣當我完成一個交換兩名雇員的職位的交易時,外鍵在交易后具有正確的值。

例如,如果我們有:

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

沒有看到錯誤,很難修復它,但是您可以嘗試:

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM