如何将当前日期时间插入触发器中的 table? - PLSQL

How to insert current datetime into a table in a trigger? - PLSQL

我一直在处理一个数据库,该数据库存储了有关旅行和这些旅行预订的数据。我还有一个 table ReservationLog,它存储给定预订状态的变化,以及它们发生的时间。 我被告知要创建一个触发器,在添加新预订后工作,这也会在 ReservationLog table 中创建一个新条目。但是,在尝试编译代码时出现错误: PLS-00049 - incorrect binding variable "NEW.LOG_DATE"

table ReservationLog 如下所示:

CREATE TABLE  RESERVATIONLOG
(
    ID INT GENERATED ALWAYS  AS IDENTITY NOT NULL,
    RESERVATION_ID INT,
    LOG_DATE DATE,
    STATUS CHAR(1),
    CONSTRAINT RL_PK PRIMARY KEY
    (
        ID
    )
    ENABLE
);

RESERVATION_ID is a foreign key

触发函数的代码如下所示:

CREATE OR REPLACE TRIGGER AddReservationTrigger
    AFTER INSERT ON
    RESERVATION
    REFERENCING OLD AS OLD NEW AS NEW
    FOR EACH ROW
    DECLARE  V_TODAY DATE;

    BEGIN

        SELECT SYSDATE INTO V_TODAY FROM DUAL;
        INSERT INTO RESERVATIONLOG
            (
             RESERVATION_ID,
             LOG_DATE,
             STATUS
            )
            VALUES
            (
             :new.RESERVATION_ID,
             :new.LOG_DATE,
             :new.STATUS
);
    end;
/

不知道该怎么做,我试着给它赋值::new.LOG_DATE :=SYSDATE 但它不起作用。我觉得这很愚蠢,但无法弄清楚这里有什么问题。

您可以在插入语句中直接引用 sysdate 之类的内容,例如:

CREATE OR REPLACE TRIGGER AddReservationTrigger
AFTER INSERT ON RESERVATION
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
BEGIN

    INSERT INTO RESERVATIONLOG
        (
         RESERVATION_ID,
         LOG_DATE,
         STATUS
        )
        VALUES
        (
         :new.RESERVATION_ID,
         SYSDATE,
         :new.STATUS
        );
end;
/

旁注:您无法更改的原因:new.LOG_DATE 是因为这是 RESERVATION table 上的“AFTER”触发器;触发器在插入完成后触发,因此更改该列的值没有意义。