Jon*_*Jon 9 oracle date constraints
我试图检查添加以下约束,但Oracle返回如下所示的错误.
ALTER TABLE Table1
ADD (CONSTRAINT GT_Table1_CloseDate
CHECK (CloseDate > SYSDATE),
CONSTRAINT LT_Table1_CloseDate
CHECK (CloseDate <= SYSDATE + 365)),
CONSTRAINT GT_Table1_StartDate
CHECK (StartDate > (CloseDate + (SYSDATE + 730))));
Run Code Online (Sandbox Code Playgroud)
错误:
Error report:
SQL Error: ORA-02436: date or system variable wrongly specified in CHECK constraint
02436. 00000 - "date or system variable wrongly specified in CHECK constraint"
*Cause: An attempt was made to use a date constant or system variable,
such as USER, in a check constraint that was not completely
specified in a CREATE TABLE or ALTER TABLE statement. For
example, a date was specified without the century.
*Action: Completely specify the date constant or system variable.
Setting the event 10149 allows constraints like "a1 > '10-MAY-96'",
which a bug permitted to be created before version 8.
Run Code Online (Sandbox Code Playgroud)
Jus*_*ave 16
遗憾的是,检查约束不能引用像SYSDATE这样的函数.您需要创建一个触发器,在DML发生时检查这些值,即
CREATE OR REPLACE TRIGGER trg_check_dates
BEFORE INSERT OR UPDATE ON table1
FOR EACH ROW
BEGIN
IF( :new.CloseDate <= SYSDATE )
THEN
RAISE_APPLICATION_ERROR( -20001,
'Invalid CloseDate: CloseDate must be greater than the current date - value = ' ||
to_char( :new.CloseDate, 'YYYY-MM-DD HH24:MI:SS' ) );
END IF;
IF( :new.CloseDate > add_months(SYSDATE,12) )
THEN
RAISE_APPLICATION_ERROR( -20002,
'Invalid CloseDate: CloseDate must be within the next year - value = ' ||
to_char( :new.CloseDate, 'YYYY-MM-DD HH24:MI:SS' ) );
END IF;
IF( :new.StartDate <= add_months(:new.CloseDate,24) )
THEN
RAISE_APPLICATION_ERROR( -20002,
'Invalid StartDate: StartDate must be within 24 months of the CloseDate - StartDate = ' ||
to_char( :new.StartDate, 'YYYY-MM-DD HH24:MI:SS' ) ||
' CloseDate = ' || to_char( :new.CloseDate , 'YYYY-MM-DD HH24:MI:SS' ) );
END IF;
END;
Run Code Online (Sandbox Code Playgroud)
Mar*_*ski 14
您不能在检查约束中使用SYSDATE.根据文件
检查约束条件不能包含以下结构:
- 子查询和标量子查询表达式
- 调用不确定的函数(CURRENT_DATE,
CURRENT_TIMESTAMP,DBTIMEZONE,
LOCALTIMESTAMP,SESSIONTIMEZONE,
SYSDATE,SYSTIMESTAMP,UID,USER和USERENV)- 调用用户定义的函数
- 取消引用REF列(例如,使用DEREF函数)
- 嵌套表列或属性
- 伪列CURRVAL,NEXTVAL,LEVEL或ROWNUM
- 未完全指定的日期常量
对于10g第2版(10.2),请参阅约束,对于11g第2版(11.2),请参阅约束.
请记住,完整性约束是关于表数据的声明,它始终为 true.
无论如何:我不确切地知道你想要实现什么,但我认为你可以使用触发器来达到这个目的.
每次记录更新时,SYSDATE都会具有不同的值。因此,约束每次都会不同地验证。因此,Oracle不允许在约束中使用sysdate。
您可以使用触发器来解决您的问题,该触发器检查CloseDate是否已实际更改,并在新值不在范围内时引发异常。
并且:什么是(StartDate > (CloseDate + (SYSDATE + 730))))?您无法添加日期。
并且:StartDate需要之后 CloseDate吗?那不奇怪吗?
Write sysdate into a column and use it for validation. This column might be your audit column (For eg: creation date)
CREATE TABLE "AB_EMPLOYEE22"
(
"NAME" VARCHAR2 ( 20 BYTE ),
"AGE" NUMBER,
"SALARY" NUMBER,
"DOB" DATE,
"DOJ" DATE DEFAULT SYSDATE
);
Table Created
ALTER TABLE "AB_EMPLOYEE22" ADD CONSTRAINT
AGE_CHECK CHECK((ROUND((DOJ-DOB)/365)) = AGE) ENABLE;
Table Altered
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
44646 次 |
| 最近记录: |