用戶表 TM_WWM 中日期字段 SALEDATE 為 VARCHAR2(8),格式 YYYYMMDD。導入前需驗證日期合法性,直接 TO_DATE 會拋出錯誤:
ORA-01847: day of month must be between 1 and last day of month(如 00 日、2 月 30 日)ORA-01843: not a valid month(月份非 01-12)創建一個函數,捕獲轉換異常,返回標誌位或合法日期:
CREATE OR REPLACE FUNCTION is_valid_date(p_str VARCHAR2, p_fmt VARCHAR2 DEFAULT 'YYYYMMDD')
RETURN NUMBER IS
v_date DATE;
BEGIN
v_date := TO_DATE(p_str, p_fmt);
RETURN 1; -- 合法
EXCEPTION
WHEN OTHERS THEN
RETURN 0; -- 不合法
END;
/
-- 查詢所有非法日期記錄 SELECT * FROM TM_WWM WHERE is_valid_date(SALEDATE) = 0; -- 僅導入合法日期數據 INSERT INTO target_table (sale_date) SELECT TO_DATE(SALEDATE, 'YYYYMMDD') FROM TM_WWM WHERE is_valid_date(SALEDATE) = 1;
在調用 TO_DATE 前先用正則過濾明顯格式錯誤,減少異常開銷:
SELECT * FROM TM_WWM
WHERE REGEXP_LIKE(SALEDATE, '^\d{8}$') -- 8 位數字
AND TO_NUMBER(SUBSTR(SALEDATE, 5, 2)) BETWEEN 1 AND 12 -- 月份 01-12
AND TO_NUMBER(SUBSTR(SALEDATE, 7, 2)) BETWEEN 1 AND 31; -- 日期 01-31(粗略)
-- 再配合 is_valid_date 函數做精確校驗