SQL触发器将表中的空值替换为INSERT上的当前日期?

时间:2017-04-21 23:48:24

标签: sql oracle date plsql triggers

我正在编写一个触发器,用于替换插入我NULL表的dates(类型DATE)列中的任何Appointments值。但我无法弄清楚如何插入当前日期。

我的触发器代码:

CREATE OR REPLACE TRIGGER appointment_date_insert
BEFORE INSERT
ON appointments
FOR EACH ROW
WHEN (NEW.dates IS NULL)
BEGIN
     :NEW.dates := NOW();
END;
/

上面给出了编译器日志中的错误:

  

NOW()必须声明

我也尝试使用GETDATE()而不是NOW(),但它在编译器日志中给出了与上面相同的错误。

要测试此触发器,INSERT列的NULL dates示例INSERT INTO appointments VALUES (1, 'John', 'Doe', NULL); 查询如下:

appointments

我的patient_ID表只有4列:first_namelast_namedatesappointments

理想情况下,最终结果应该在NULL表中插入一个新行,如下所示:

  

1 |约翰| Doe | 2017年4月21日

使用当前日期替换DEFAULT

编辑:我不允许更改任何原始表格结构,包括set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -cc1") 值,否则我不需要在第一个问题中提出这个问题地方....

1 个答案:

答案 0 :(得分:0)

编辑如果没有now()的同义词,则now()此解决方案无效。

如果COALESCE:NEW,您可以使用NOW()NULL日期替换为CREATE TABLE APPOINTMENTS(PATIENT_ID NUMBER, FIRST_NAME VARCHAR2(64), LAST_NAME VARCHAR2(64), DATES DATE); CREATE OR REPLACE TRIGGER appointment_date_insert BEFORE INSERT ON appointments FOR EACH ROW BEGIN :NEW.dates := COALESCE(:NEW.DATES,NOW()); END; / ,否则请将其排除在外:

INSERT INTO appointments VALUES (1, 'John', 'Doe', NULL);
INSERT INTO appointments VALUES (2, 'Jane', 'Doe', SYSDATE - 100);

SELECT * FROM APPOINTMENTS;

PATIENT_ID  FIRST_NAME  LAST_NAME  DATES      
1           John        Doe        21-APR-17  
2           Jane        Doe        11-JAN-17  

然后测试一下:

NOW()

作为SYSDATE的替代方案,您可以考虑CURRENT_DATE(或CREATE OR REPLACE TRIGGER appointment_date_insert BEFORE INSERT ON appointments FOR EACH ROW BEGIN :NEW.dates := COALESCE(:NEW.DATES,SYSDATE); END; / ,如果您愿意的话)

position: relative;