[英]PL/SQL Trigger with specific variable from update
I'm trying to trigger an update after an update. 我正在尝试在更新后触发更新。
My Tables: 我的桌子:
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'));
My Trigger: 我的触发器:
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;
/
What I'm basically trying to do is increment the WARNING_ID when OVERDRAWN is updated to 'Y' (yes). 我基本上想做的是在OVERDRAWN更新为“ Y”(是)时增加WARNING_ID。 Error report -
错误报告 -
ORA-04079: invalid trigger specification
04079. 00000 - "invalid trigger specification"
*Cause: The create TRIGGER statement is invalid.
*Action: Check the statement for correct syntax.
What did I do wrong? 我做错了什么?
you were using assignment operator(:=) in IF statement. 您在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;
/
As well as the use of :=
instead of =
for comparison that @Prashant pointed out, there are some other issues. @Prashant指出,除了使用
:=
代替=
进行比较外,还有其他一些问题。 The actual error you see is because of the REFERENCING
line, which should not have the AND
. 您看到的实际错误是由于
REFERENCING
行,该行不应具有AND
。
But you can't use new and old for statement triggers, so you need to make it a FOR EACH ROW
trigger too: 但是您不能对语句触发器使用新旧触发器,因此也需要使其成为
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;
/
You were referring to RENTAL.STUDENT_ID
, but that is out of scope for the SQL statement. 您指的是
RENTAL.STUDENT_ID
,但这在SQL语句的范围之外。 So I've changed that to refer to the current row, with :NEW.STUDENT_ID
. 所以我将其更改为使用
:NEW.STUDENT_ID
来引用当前行。 But either way, your RENTAL
table doesn't have a STUDENT_ID
column, but you may have just omitted that when editing the definition for posting. 但是,无论哪种方式,您的
RENTAL
表都没有STUDENT_ID
列,但是在编辑要发布的定义时,您可能只是略过了这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.