日付の文字列が正しい日付かチェックする
IS_DATE ファンクション (日付文字列の有効性チェック)
文字列型の日付の整合性をチェックする関数は組み込み関数およびパッケージに用意されていない。
不正な日付文字をチェックなしに TO_DATE 関数 を使用すると例外が発生する。
これは外部入力データの投入バッチ処理などにおいて、トランザクション がロールバックすることにつながる。
CSV や文字列、テキストベースで用意されたデータをデータベースに投入する際の日付のチェック処理は欠かせない。
日付文字列の形式はグレゴリオ暦のみ有効
CREATE OR REPLACE FUNCTION RIVUS.IS_DATE(
P_DATE IN VARCHAR,
P_FORMAT IN VARCHAR := 'RR/MM/DD HH24:MI:SS' ,
P_EXTRACT IN BOOLEAN := FALSE
)
RETURN NUMBER
AS
-- vDateFormat VARCHAR2(40) NOT NULL := P_FORMAT;
-- 上の記述では NULL の入力を例外処理できない。
vDateFormat VARCHAR2(40) NOT NULL := 'RR/MM/DD HH24:MI:SS';
vDate DATE;
BEGIN
vDateFormat := P_FORMAT;
IF (P_EXTRACT) THEN
vDateFormat := 'FX' || vDateFormat;
END IF;
vDate := TO_DATE(P_DATE, vDateFormat, q'{NLS_CALENDAR = 'GREGORIAN'}' );
-- vDate := TO_DATE(P_DATE, vDateFormat, 'NLS_CALENDAR = ''GREGORIAN''' );
RETURN 1;
EXCEPTION
WHEN OTHERS THEN
RETURN 0;
END;
/
IS_DATE 使用例
SELECT
DECODE(IS_DATE(DATE_STR), 1, TO_DATE(DATE_STR), TO_DATE('9999/12/31'))
FROM DATE_STRING ;
q'{NLS_CALENDAR = 'GREGORIAN'}' は代替引用符を使った記述方法
関連事項