[英]PL/SQL Trigger with specific variable from update
我正在嘗試在更新后觸發更新。
我的桌子:
CREATE TABLE STUDENT (
STUDENT_ID INTEGER PRIMARY KEY,
NAME CHAR(40) NOT NULL,
SURNAME CHAR(40) NOT NULL,
TOKEN CHAR(5) NOT NULL,
STUDYCOURSE CHAR(20) NOT NULL,
NOTE VARCHAR(255) NULL,
WARNING_ID INTEGER REFERENCES MAHNUNG (ID),
BLOCKED CHAR(1) CHECK (Gesperrt IN('J', 'N'));
create table RENTAL (
RENTAL_ID INTEGER PRIMARY KEY,
RENTALDATE DATE DEFAULT SYSDATE,
RENTALDURATION INTEGER NOT NULL,
OVERDRAWN CHAR(1) CHECK (OVERDRAWN IN('Y', 'N'));
我的觸發器:
CREATE OR REPLACE TRIGGER OVERDRAWN_RETURN
AFTER UPDATE OF OVERDRAWN ON RENTAL
REFERENCING OLD AS OLD AND NEW AS NEW
BEGIN
IF :NEW.OVERDRAWN := 'Y' THEN
UPDATE STUDENT SET WARNING_ID = WARNING_ID+1
WHERE STUDENT.STUDENT_ID = RENTAL.STUDENT_ID;
END IF;
END OVERDRAWN_RETURN;
/
我基本上想做的是在OVERDRAWN更新為“ Y”(是)時增加WARNING_ID。 錯誤報告 -
ORA-04079: invalid trigger specification
04079. 00000 - "invalid trigger specification"
*Cause: The create TRIGGER statement is invalid.
*Action: Check the statement for correct syntax.
我做錯了什么?
您在IF語句中使用賦值運算符(:=)。
CREATE OR REPLACE TRIGGER OVERDRAWN_RETURN
AFTER UPDATE OF OVERDRAWN ON RENTAL
REFERENCING OLD AS OLD AND NEW AS NEW
BEGIN
IF :NEW.OVERDRAWN = 'Y' THEN
UPDATE STUDENT SET WARNING_ID = WARNING_ID+1
WHERE STUDENT.STUDENT_ID = RENTAL.STUDENT_ID;
END IF;
END OVERDRAWN_RETURN;
/
@Prashant指出,除了使用:=
代替=
進行比較外,還有其他一些問題。 您看到的實際錯誤是由於REFERENCING
行,該行不應具有AND
。
但是您不能對語句觸發器使用新舊觸發器,因此也需要使其成為FOR EACH ROW
觸發器:
CREATE OR REPLACE TRIGGER OVERDRAWN_RETURN
AFTER UPDATE OF OVERDRAWN ON RENTAL
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
BEGIN
IF :NEW.OVERDRAWN = 'Y' THEN
UPDATE STUDENT SET WARNING_ID = WARNING_ID+1
WHERE STUDENT_ID = :NEW.STUDENT_ID;
END IF;
END OVERDRAWN_RETURN;
/
您指的是RENTAL.STUDENT_ID
,但這在SQL語句的范圍之外。 所以我將其更改為使用:NEW.STUDENT_ID
來引用當前行。 但是,無論哪種方式,您的RENTAL
表都沒有STUDENT_ID
列,但是在編輯要發布的定義時,您可能只是略過了這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.