Oracle 尝试根据日期和时间创建触发器

Oracle 尝试根据日期和时间创建触发器,oracle,plsql,triggers,Oracle,Plsql,Triggers,我正在尝试创建一个触发器,如果在办公时间以外(即8-18小时或星期日以外)进行插入、更新和删除,它将阻止插入、更新和删除 这是我的密码: CREATE OR REPLACE TRIGGER HOLIDAY BEFORE DELETE OR INSERT OR UPDATE ON DEPT FOR EACH ROW BEGIN IF ((EXTRACT(DAY FROM SYSDATE)='SUNDAY') OR (EXTRACT(HOUR FROM LOCALTIMESTAMP) NOT BET

我正在尝试创建一个触发器,如果在办公时间以外(即8-18小时或星期日以外)进行插入、更新和删除,它将阻止插入、更新和删除

这是我的密码:

CREATE OR REPLACE TRIGGER HOLIDAY
BEFORE DELETE OR INSERT OR UPDATE ON DEPT FOR EACH ROW
BEGIN
IF ((EXTRACT(DAY FROM SYSDATE)='SUNDAY') OR (EXTRACT(HOUR FROM LOCALTIMESTAMP) NOT BETWEEN 8 AND 18)) THEN
   RAISE_APPLICATION_ERROR(-20001,'ILLEGAL OPERATION - OUT OF OFFICE HOURS OR HOLIDAY!');
 END IF ;
END; 
/
触发器已创建。 今天是星期日,当我尝试插入一行时,应用程序错误不是raise,而是:

SQL> @/home/divya/A43.SQL

Trigger created.

SQL> DELETE FROM DEPT WHERE D_NO = 'D3' ;
DELETE FROM DEPT WHERE D_NO = 'D3'
            *
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at "DIVYA12345.HOLIDAY", line 2
ORA-04088: error during execution of trigger 'DIVYA12345.HOLIDAY'

有人能告诉我到底是什么错误吗?显示错误显示-无错误作为输出。非常感谢您的帮助。提前谢谢

之所以会出现错误,是因为
EXTRACT(DAY FROM SYSDATE)
返回的是月份中的天数,而不是其名称。要检索名称,您可以使用
To_CHAR(SYSDATE,'DAY')
,或者
To_CHAR(SYSDATE,'fmDY,'nls_date\u language=ENGLISH')
,如注释中所示:

CREATE OR REPLACE TRIGGER HOLIDAY
BEFORE DELETE OR INSERT OR UPDATE ON DEPT FOR EACH ROW
BEGIN
IF (TO_CHAR(sysdate,'fmDY', 'nls_date_language = ENGLISH')='SUNDAY') OR (EXTRACT(HOUR FROM LOCALTIMESTAMP) NOT BETWEEN 8 AND 18)) THEN
   RAISE_APPLICATION_ERROR(-20001,'ILLEGAL OPERATION - OUT OF OFFICE HOURS OR HOLIDAY!');
END IF ;
END; 
/

为了更加安全,我会使用
来存储字符(sysdate,'fmDY',nls\u date\u language=ENGLISH)
。否则,具有不同会话日期设置的最终用户可能会通过触发器。@WilliamRobertson是正确的,但不是因为他说的原因:)事实上,您需要使用
fm
,因为
to_CHAR(SYSDATE,'DAY'))
不等于
'SUNDAY'
-
DAY
用空格填充,因此它实际上等于
'SUNDAY'
@JeffreyKemp-你说得对。我知道我总是使用
fmDy
的第二个原因。但是指定一种语言是值得的,以防一个拥有法语桌面的用户在Dimanche上运行它:)作为旁白,逻辑也需要修正。此代码允许在18:45插入,因为时间在8到18之间。你说得对,谢谢!