我與具有包含格式化日期字符串如下列遺留Oracle數據庫工作:甲骨文CHECK約束異體
30-Apr-03
30-Apr-2003
列數據類型是VARCHAR2(12)
(儘管11
就足夠了)。這兩種表示都可以出現在單個列中。
問題:我如何寫一個CHECK
約束,允許在一列只有這兩個日期字符串變量?
我與具有包含格式化日期字符串如下列遺留Oracle數據庫工作:甲骨文CHECK約束異體
30-Apr-03
30-Apr-2003
列數據類型是VARCHAR2(12)
(儘管11
就足夠了)。這兩種表示都可以出現在單個列中。
問題:我如何寫一個CHECK
約束,允許在一列只有這兩個日期字符串變量?
這裏是一個CHECK
約束來驗證形式19-Oct-12
或19-Oct-2012
的日期字符串。對於具有兩位數年份的日期字符串,請使用RegEx以19
前綴年,以避免Oracle錯誤ORA-02436 - date or system variable wrongly specified in CHECK constraint
。
ALTER TABLE table1
MODIFY col_date1 CONSTRAINT col_date1_ck
CHECK ((TO_DATE(
REGEXP_REPLACE(col_date1, '^(......-)(..)$', '\119\2'),
'DD-Mon-YYYY') > TO_DATE('31-Dec-1899')));
從長期來看,如果它是可以接受的修改模式,使用DATE數據類型(11g第2版(11.2))可能更合適。
UPDATE:不幸的是,這不是一個有效的解決方案。首先,這裏是這個CHECK
約束可以作爲一種情況意:
Value: '05/Nov/2012'
這是不想要的,因爲其目的是使用'-'
:
Value: '05/Nov/12'
Result: ORA-02290: check constraint (TABLE1.COL_DATE1_CK) violated
然而,這個日期字符串被限制接受作爲字段分隔符,而不是'/'
。最後,考慮這個日期字符串及其結果:
Value: '05/Foo/2012'
Result: ORA-01843: not a valid month
這裏還有,這個約束不允許這個值進入保護列。但是,由此產生的異常沒有跡象表明這是違反約束的。 (什麼是想要的是第一個例子所示ORA-02290
但TO_DATE()
是不是返回CHECK
約束返回False
的例外。)
備選:基於這些原因,我最終還是決定通過來解決這個問題觸發器。但我當然歡迎修改這種限制的想法,以便它真正實現目標。