所以我有如下触发器
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;
如果系统日期是 SUNDAY
,应该阻止 UPDATE
、INSERT
和 DELETE
。在我看来,这在逻辑上似乎是正确的,但不幸的是它仍然允许插入。我在这里做错了什么?我正在使用 SQL Developer
请帮忙
非常感谢
最佳答案
to_char(sysdate, 'day')
生成一个用空白填充到最长一天长度的字符串(如果您的语言是英语,则需要 9 个字符来处理字符串“Wednesday” ”)。这是因为在过去,您会有固定宽度的文本报告,并且您希望每个值都具有相同的宽度。
您可以在比较之前调整该值。但更优雅的方法是在 to_char
中使用 fm
修饰符。这会阻止 Oracle 默认使用空白填充。您可以将它与基本上任何格式掩码一起使用,以空白填充结果。
v_day := to_char( sysdate, 'fmDAY' )
关于sql - 基于系统时间触发(DAY),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34345417/