SQL触发器用INSERT上的当前日期替换表中的空值?
Posted
技术标签:
【中文标题】SQL触发器用INSERT上的当前日期替换表中的空值?【英文标题】:SQL Trigger To Replace Null Values in table with Current Date on INSERT? 【发布时间】:2017-04-21 23:48:23 【问题描述】:我正在编写一个触发器,它替换插入到我的Appointments
表的dates
(类型为DATE
)列中的任何NULL
值。但我不知道如何插入当前日期。
我的触发代码:
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
表只有 4 列:patient_ID
、first_name
、last_name
和 dates
理想情况下,最终结果应该在appointments
表中插入一个新行,如下所示:
1 |约翰 |能源部 | 04-21-2017
用当前日期替换NULL
值
编辑:我不允许更改任何原始表结构,包括 DEFAULT
值,否则我一开始就不需要问这个问题....
【问题讨论】:
能否修改表格,让日期字段的默认值为getdate()? 没有。不允许更改任何原始表格。必须使用触发器。 在 Oracle 中,我们使用SYSDATE
来获取当前日期::new.dates := sysdate;
【参考方案1】:
编辑如果没有now()
的同义词,这个带有now()
的解决方案将无法工作。
如果是NULL
,您可以使用COALESCE
将:NEW
日期替换为NOW()
,否则不要理会它:
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;
/
【讨论】:
不幸的是我已经尝试过了,它仍然告诉我必须声明NOW
。 GETDATE
也一样。
感谢@5120bee,这很有趣。我会用另一个或两个替代方案更新帖子。你能告诉我你使用的是什么版本的 oracle 吗?
我有 11.2.0.2.0
Oracle 中没有NOW()
;相反,有SYSDATE
。
我刚刚运行了select now() from dual
,它抛出了一个异常——now()
无法识别。我在 12.1,所以它不是旧版本。以上是关于SQL触发器用INSERT上的当前日期替换表中的空值?的主要内容,如果未能解决你的问题,请参考以下文章
sql server 查询 order by 与 union 并替换多个列的空值