簡體   English   中英

PL / SQL觸發器具有來自更新的特定變量

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

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