2012-10-19 69 views
0

我與具有包含格式化日期字符串如下列遺留Oracle數據庫工作:甲骨文CHECK約束異體

30-Apr-03 

30-Apr-2003 

列數據類型是VARCHAR2(12)(儘管11就足夠了)。這兩種表示都可以出現在單個列中。

問題:我如何寫一個CHECK約束,允許在一列只有這兩個日期字符串變量?

回答

2

這裏是一個CHECK約束來驗證形式19-Oct-1219-Oct-2012的日期字符串。對於具有兩位數年份的日期字符串,請使用RegEx19前綴年,以避免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-02290TO_DATE()是不是返回CHECK約束返回False的例外。)

備選:基於這些原因,我最終還是決定通過來解決這個問題觸發器。但我當然歡迎修改這種限制的想法,以便它真正實現目標。