【问题标题】:create a trigger in oracle to avoid insertion on sunday在 oracle 中创建触发器以避免在星期日插入
【发布时间】:2016-12-13 12:38:14
【问题描述】:

我在 oracle 中有员工表。我想创建一个触发器,以避免在星期日插入数据。请告诉我程序?以下程序无法运行。

【问题讨论】:

  • 以下是什么意思?你的代码在哪里?
  • 您好,请阅读How to Ask

标签: oracle plsql oracle11g database-trigger


【解决方案1】:

这是一个检查工作日的示例触发器,如果​​星期天 (7),则引发用户定义的异常 ORA-20000:

CREATE OR REPLACE TRIGGER trg_sunday
BEFORE INSERT ON employee
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
    IF TO_CHAR(SYSDATE, 'D') = '7' THEN
        RAISE_APPLICATION_ERROR(-20000, 'Cannot insert record on sunday'); 
    END IF;
END;

请检查哪个数字标识星期天,这取决于数据库的本地 NLS 设置。在意大利(NLS_TERRITORY='ITALY') 星期日由 7 标识,但使用不同的数据库 NLS 设置,数字可能会有所不同。 你可以看看Day of week (1-7) and NLS settings

【讨论】:

  • 这又错了.. 7 不是星期天..根据 oracle 它的 1. 请检查我的查询。
  • 1 或 7 可能是对的,也可能是错的。这取决于数据库的 NLS 设置
  • 所以你必须知道哪个 NLS 设置也会像星期天一样给出 7。
【解决方案2】:

触发器保持不变,但查询如下:

查看今天是什么日子"

select to_char(to_date('08/08/2016','dd/mm/yyyy'), 'DY'),TO_CHAR(SYSDATE, 'D') from dual;

下周日检查:

select to_char(to_date('14/08/2016','dd/mm/yyyy'), 'DY'),TO_CHAR(to_date('14/08/2016','dd/mm/yyyy'), 'D') from dual;

正确的代码应该是:

CREATE OR REPLACE TRIGGER trg_sunday
BEFORE INSERT ON employee
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
    IF TO_CHAR(SYSDATE, 'D') = '1' THEN   ---Should be 1 rather than 7
        RAISE_APPLICATION_ERROR(-20000, 'Cannot insert record on sunday'); 
    END IF;
END;

【讨论】:

  • 1 或 7 可能是对的,也可能是错的。这取决于数据库的 NLS 设置
  • 由于大多数初始设置都是 AMERICAN ,所以上面说的是有道理的。否则必须修改他或她的 NLS 设置。
【解决方案3】:

您可以创建触发器,如下面的代码 sn-p 所示。

CREATE OR REPLACE TRIGGER sunday_prevent
BEFORE INSERT ON account 
FOR EACH ROW
Begin
       IF TO_CHAR(SYSDATE,'day')='sunday' then
               raise_application_error(-20000,'Today is Sunday so you not perform any transaction');
       END IF;
END;
/

【讨论】:

    猜你喜欢
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 2013-12-26
    • 2013-12-24
    • 2018-02-07
    • 2018-11-25
    相关资源
    最近更新 更多