【问题标题】:CURRENT_DATE OracleCURRENT_DATE 甲骨文
【发布时间】:2019-06-16 03:06:14
【问题描述】:

我很难添加新的出生日期列,检查规则年龄在 18 到 65 之间。 我将 sqplus 与 Oracle 一起使用 总是收到错误消息 ORA00920 需要你的帮助

ALTER TABLE Vendeur ADD (dateNaissance DATE, 
            dateDebutProjet DATE NOT NULL,  
            DateFinProjet DATE NOT NULL,
            CONSTRAINT chk_date_Birth CHECK ((TRUNC(CURRENT_DATE)-dateNaissance) 
            BETWEEN 18 AND 65),
            CONSTRAINT chk_date_Projet CHECK (DateFinProjet > dateDebutProjet));

【问题讨论】:

  • 您使用的是 MySQL 还是 Oracle?
  • Oracle 与 sqplus

标签: oracle sqlplus


【解决方案1】:

如果能帮上忙,不带触发器的解决方案(因为当时我们没学过hem):

ALTER TABLE Vendeur ADD (dateNaissance DATE, debutProjet DATE DEFAULT '01/01/1000' NOT NULL, finProjet DATE DEFAULT '02/01/1000' NOT NULL, dateDuJour Date DEFAULT CURRENT_DATE, CONSTRAINT chk_date_Projet CHECK (finProjet > debutProjet), CONSTRAINT chk_date_Birth CHECK ((dateDuJour - dateNaissance)\365 BETWEEN 18 AND 65) );

【讨论】:

    【解决方案2】:

    检查约束cannot call non-deterministic functions like CURRENT_DATE。检查约束应该始终为真,如果检查约束过期,可能会发生奇怪的事情。

    以下示例代码显示了您在检查约束中尝试使用CURRENT_DATE 时可能会遇到的错误之一:

    SQL> create table test1(a date);
    
    Table created.
    
    SQL> alter table test1 add constraint test1_ck1 check(a > date '2000-01-01');
    
    Table altered.
    
    SQL> alter table test1 add constraint test1_ck2 check(a > current_date);
    alter table test1 add constraint test1_ck2 check(a > current_date)
                                                         *
    ERROR at line 1:
    ORA-02436: date or system variable wrongly specified in CHECK constraint
    

    创建一个触发器来解决这个问题:

    create or replace trigger test1_date_gt_today
    before update or insert of a on test1
    for each row
    begin
        if :new.a is null or :new.a < current_date then
            raise_application_error(-20000, 'The date cannot be earlier than today.');
        end if;
    end;
    /
    

    下面是一个 INSERT 工作的例子,一个不满足触发器条件的例子:

    SQL> insert into test1 values(sysdate + 1);
    
    1 row created.
    
    SQL> insert into test1 values(sysdate - 1);
    insert into test1 values(sysdate - 1)
                *
    ERROR at line 1:
    ORA-20000: The date cannot be earlier than today.
    ORA-06512: at "JHELLER.TEST1_DATE_GT_TODAY", line 3
    ORA-04088: error during execution of trigger 'JHELLER.TEST1_DATE_GT_TODAY'
    

    【讨论】:

    • 谢谢乔恩·海勒。真的很感激
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 2011-07-19
    • 2014-09-11
    • 2011-06-15
    • 2020-06-10
    • 2018-08-20
    相关资源
    最近更新 更多