当前位置:  开发笔记 > 数据库 > 正文

基于系统时间(DAY)触发

如何解决《基于系统时间(DAY)触发》经验,为你挑选了1个好方法。

所以我触发如下

create or replace TRIGGER TWELVE_ONE 
BEFORE INSERT OR UPDATE OR DELETE
ON ORDERS
FOR EACH ROW 
DECLARE 
V_DAY VARCHAR2 (10); 
MyException exception; 

BEGIN 

SELECT TO_CHAR (SYSDATE, 'DAY') INTO V_DAY FROM DUAL; 
DBMS_OUTPUT.PUT_LINE(V_DAY); 

IF (V_DAY='SUNDAY') 
THEN 
raise_application_error(-20001, 'Today is Sunday. Order table cannot be altered'); 
end if;
END;

这应该防止UPDATE,INSERT并且DELETE如果系统一天SUNDAY.从逻辑上讲,它似乎是正确的,但不幸的是它仍然允许插入.我在这做错了什么?我正在使用SQL Developer请帮助非常感谢



1> Justin Cave..:

to_char(sysdate, 'day')生成一个空格填充到最长日期的字符串(如果您的语言是英语,那么处理字符串"星期三"将是9个字符).这是因为在过去的日子里,你有固定宽度的文本报告,你希望每个值都有相同的宽度.

您可以在比较之前修剪该值.但更优雅的方法是fm在你的使用修饰符to_char.这会阻止Oracle默认为空白填充.您可以使用此基本上任何格式掩码,空白填充结果.

v_day := to_char( sysdate, 'fmDAY' )


为了独立于用户会话NLS-Settings,您应该更喜欢`IF to_char(sysdate,'fmDAY','NLS_DATE_LANGUAGE = american')='SUNDAY'那么
推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有