【发布时间】:2016-12-13 12:38:14
【问题描述】:
我在 oracle 中有员工表。我想创建一个触发器,以避免在星期日插入数据。请告诉我程序?以下程序无法运行。
【问题讨论】:
-
以下是什么意思?你的代码在哪里?
-
您好,请阅读How to Ask。
标签: oracle plsql oracle11g database-trigger
我在 oracle 中有员工表。我想创建一个触发器,以避免在星期日插入数据。请告诉我程序?以下程序无法运行。
【问题讨论】:
标签: oracle plsql oracle11g database-trigger
这是一个检查工作日的示例触发器,如果星期天 (7),则引发用户定义的异常 ORA-20000:
CREATE OR REPLACE TRIGGER trg_sunday
BEFORE INSERT ON employee
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
IF TO_CHAR(SYSDATE, 'D') = '7' THEN
RAISE_APPLICATION_ERROR(-20000, 'Cannot insert record on sunday');
END IF;
END;
请检查哪个数字标识星期天,这取决于数据库的本地 NLS 设置。在意大利(NLS_TERRITORY='ITALY') 星期日由 7 标识,但使用不同的数据库 NLS 设置,数字可能会有所不同。
你可以看看Day of week (1-7) and NLS settings
【讨论】:
触发器保持不变,但查询如下:
查看今天是什么日子"
select to_char(to_date('08/08/2016','dd/mm/yyyy'), 'DY'),TO_CHAR(SYSDATE, 'D') from dual;
下周日检查:
select to_char(to_date('14/08/2016','dd/mm/yyyy'), 'DY'),TO_CHAR(to_date('14/08/2016','dd/mm/yyyy'), 'D') from dual;
正确的代码应该是:
CREATE OR REPLACE TRIGGER trg_sunday
BEFORE INSERT ON employee
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
IF TO_CHAR(SYSDATE, 'D') = '1' THEN ---Should be 1 rather than 7
RAISE_APPLICATION_ERROR(-20000, 'Cannot insert record on sunday');
END IF;
END;
【讨论】:
您可以创建触发器,如下面的代码 sn-p 所示。
CREATE OR REPLACE TRIGGER sunday_prevent
BEFORE INSERT ON account
FOR EACH ROW
Begin
IF TO_CHAR(SYSDATE,'day')='sunday' then
raise_application_error(-20000,'Today is Sunday so you not perform any transaction');
END IF;
END;
/
【讨论】: