如何将当前日期时间插入触发器中的 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”触发器;触发器在插入完成后触发,因此更改该列的值没有意义。
我一直在处理一个数据库,该数据库存储了有关旅行和这些旅行预订的数据。我还有一个 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”触发器;触发器在插入完成后触发,因此更改该列的值没有意义。