[英]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.