sql - 基于系统时间触发(DAY)

标签 sql oracle oracle11g oracle-sqldeveloper plsqldeveloper

所以我有如下触发器

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,应该阻止 UPDATEINSERTDELETE。在我看来,这在逻辑上似乎是正确的,但不幸的是它仍然允许插入。我在这里做错了什么?我正在使用 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/

相关文章:

sql - 如何在sql查询中执行这一步?

oracle11g - ORA-24247: 访问被 ACL 从 PL/SQL 函数中拒绝,而不是从 SQL 中拒绝

php - 使用InnoDB引擎在mysql中插入单行时是否需要事务?

mysql - 在 Mysql 中查找最高工资的 Left Join 或 Group By

mysql - SQL 协助 WHERE 子句。获取以下代码的错误

c# - 获取项目索引(rownum)

sql - 创建表时字面量与格式字符串不匹配

oracle - 使用 cfprocparam 将数组或列表导入 Oracle

ruby-on-rails - [] :Array 的未定义方法 `find_each'

java - JRebel 远程服务器即服务