简体   繁体   English

PL / SQL触发器具有来自更新的特定变量

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM