2017-09-25 109 views
2
create or replace trigger trig1 
before delete or insert or update on students 
begin 
if(To_char(sysdate,'day') = 'monday' then 
raise_application_error(-20500,'table is secured'); 
end if; 
end; 

我创建了触发器,但它不适用于monday,它在表上执行DML操作。我找到了一个解决方案 - 使用dy而不是一天 - 但为什么?sysdate中为什么一天不能在plsql触发器的星期一工作?

+1

语法错误。不同数量的“(”和“)”。 – jarlh

+0

也许国际化设置。 –

回答

4

有两个原因。

当您使用day然后导致则以用空格来最长的名字,试图

SELECT '"'||To_char(sysdate, 'day')||'"' 
FROM dual; 

"monday " 

使用'fmday'避免这种情况。

然后TO_CHAR()的结果取决于当前用户会话NLS_DATE_LANGUAGE的设置。使用

To_char(sysdate, 'fmday', 'NLS_DATE_LANGUAGE = american') = 'monday'` 

为了独立于当前用户会话的设置。

3

Wernfried Domscheit has answered "why"您的查询不起作用(TO_CHAR(datevalue, 'DAY')被右键填充空格)。

而不是依靠NLS_DATE_LANGUAGENLS_TERRITORY设置,可能会破坏如果查询是国际上使用,你可以截断的日期和比较它的ISO周的开始(这始终是星期一),这是独立于这些设置:

create or replace trigger trig1 
before delete or insert or update on students 
begin 
    IF TRUNC(SYSDATE) = TRUNC(SYSDATE, 'IW') THEN 
    raise_application_error(-20500,'table is secured'); 
    END IF; 
end; 
/
相关问题