在触发器中使用 Sysdate
Using Sysdate in trigger
大家好,我对触发器有点菜鸟,所以我只是在寻找一些关于如何执行跟随触发器的建议。
我创建了一个触发器,如果有人在办公时间删除记录,它会抛出一条错误消息,但是我想创建另一个使用 SYSDATE 的触发器,不会删除今天和未来日期的记录。
我正在考虑使用 >=SYSDATE 但我不确定这是否是一个有效的 sql 语句。
CREATE OR REPLACE TRIGGER records_delete
BEFORE DELETE
ON RECORDS FOR EACH ROW
BEGIN
IF TO_CHAR(SYSDATE, 'HH24MI') NOT >= sysdat
RAISE_APPLICATION_ERROR(-20669, 'You can not delete current or future records');
END IF;
END records_delete;
谢谢,leprejohn
这里的问题是您没有引用要从中删除的 table 的任何字段。
如果您的 table 有一个名为 record_date 的列,那么您可以将其重写为:
CREATE OR REPLACE TRIGGER records_delete
BEFORE DELETE
ON RECORDS FOR EACH ROW
BEGIN
IF (:old.record_date >= SYSDATE) THEN
RAISE_APPLICATION_ERROR(-20669, 'You can not delete current or future records');
END IF;
END records_delete;
语法:旧。和:新。是您如何引用触发器正在操作的当前记录的列,使用 :old。作为在触发器作用于它之前检查值的前缀和 :new。在触发器完成后用于值。此语法允许您查看触发器更新数据的值 before/after,这在您的情况下无关紧要,因为您正在删除记录。
如果要忽略日期字段的小时、分钟、秒,请在 IF 语句中使用它
trunc(:old.record_date) >= trunc(SYSDATE)
如果 record_date 实际上存储为字符串而不是日期,您可以在比较之前将其转换为日期:
to_date(:old.record_date, 'DDMMYYYY') >= trunc(SYSDATE)
将格式掩码“DDMMYYYY”更新为实际存储日期的格式。查看 Oracle 文档以了解 to_date 和日期格式模型的描述。
试一试,看看是否有效。
大家好,我对触发器有点菜鸟,所以我只是在寻找一些关于如何执行跟随触发器的建议。
我创建了一个触发器,如果有人在办公时间删除记录,它会抛出一条错误消息,但是我想创建另一个使用 SYSDATE 的触发器,不会删除今天和未来日期的记录。
我正在考虑使用 >=SYSDATE 但我不确定这是否是一个有效的 sql 语句。
CREATE OR REPLACE TRIGGER records_delete
BEFORE DELETE
ON RECORDS FOR EACH ROW
BEGIN
IF TO_CHAR(SYSDATE, 'HH24MI') NOT >= sysdat
RAISE_APPLICATION_ERROR(-20669, 'You can not delete current or future records');
END IF;
END records_delete;
谢谢,leprejohn
这里的问题是您没有引用要从中删除的 table 的任何字段。
如果您的 table 有一个名为 record_date 的列,那么您可以将其重写为:
CREATE OR REPLACE TRIGGER records_delete
BEFORE DELETE
ON RECORDS FOR EACH ROW
BEGIN
IF (:old.record_date >= SYSDATE) THEN
RAISE_APPLICATION_ERROR(-20669, 'You can not delete current or future records');
END IF;
END records_delete;
语法:旧。和:新。是您如何引用触发器正在操作的当前记录的列,使用 :old。作为在触发器作用于它之前检查值的前缀和 :new。在触发器完成后用于值。此语法允许您查看触发器更新数据的值 before/after,这在您的情况下无关紧要,因为您正在删除记录。
如果要忽略日期字段的小时、分钟、秒,请在 IF 语句中使用它
trunc(:old.record_date) >= trunc(SYSDATE)
如果 record_date 实际上存储为字符串而不是日期,您可以在比较之前将其转换为日期:
to_date(:old.record_date, 'DDMMYYYY') >= trunc(SYSDATE)
将格式掩码“DDMMYYYY”更新为实际存储日期的格式。查看 Oracle 文档以了解 to_date 和日期格式模型的描述。
试一试,看看是否有效。