基于系统时间触发(DAY)
Trigger based on system time (DAY)
所以我有如下触发器
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 开发人员
请帮忙
非常感谢
to_char(sysdate, 'day')
生成一个用空白填充到最长一天的长度的字符串(如果您的语言是英语,那么处理字符串 "Wednesday" 需要 9 个字符)。这是因为在过去,您会有固定宽度的文本报告,并且您希望每个值都具有相同的宽度。
您可以 trim 比较之前的值。但更优雅的方法是在 to_char
中使用 fm
修饰符。这会阻止 Oracle 默认使用空白填充。您可以将它与基本上任何格式掩码一起使用,以空白填充结果。
v_day := to_char( sysdate, 'fmDAY' )
所以我有如下触发器
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 开发人员
请帮忙
非常感谢
to_char(sysdate, 'day')
生成一个用空白填充到最长一天的长度的字符串(如果您的语言是英语,那么处理字符串 "Wednesday" 需要 9 个字符)。这是因为在过去,您会有固定宽度的文本报告,并且您希望每个值都具有相同的宽度。
您可以 trim 比较之前的值。但更优雅的方法是在 to_char
中使用 fm
修饰符。这会阻止 Oracle 默认使用空白填充。您可以将它与基本上任何格式掩码一起使用,以空白填充结果。
v_day := to_char( sysdate, 'fmDAY' )