0

DB2 でのユーザー定義関数 (UDF) の例外処理に苦労しています。

私の問題の出発点は、特定の形式の varchar-timestamps を持つテーブルに対して SELECT を実行し、それらを timestamp-datatype に変換することです。

次の SQL ステートメントは、ポジティブなシナリオを示しています。すべての varchar-timestamp が有効です。SELECT は成功します。

DROP TABLE TMP_TSP;
CREATE TABLE TMP_TSP (TSP_VARCHAR VARCHAR(100) NOT NULL UNIQUE);
INSERT INTO TMP_TSP VALUES ('2017-02-27');
INSERT INTO TMP_TSP VALUES ('2017-02-28');
SELECT TSP_VARCHAR, timestamp_format(TSP_VARCHAR, 'YYYY-MM-DD') TSP FROM tmp_tsp;

ここまでは順調ですね。ただし、テーブルに無効な varchar-timestamp が含まれている場合、SELECT ステートメントは失敗します。

DROP TABLE TMP_TSP;
CREATE TABLE TMP_TSP (TSP_VARCHAR VARCHAR(100) NOT NULL UNIQUE);
INSERT INTO TMP_TSP VALUES ('2017-02-27');
INSERT INTO TMP_TSP VALUES ('2017-02-28');
INSERT INTO TMP_TSP VALUES ('2017-02-29'); -- Invalid Date!
select TSP_VARCHAR, timestamp_format(TSP_VARCHAR, 'YYYY-MM-DD') TSP from tmp_tsp;

SELECT ステートメントの実行は、次のエラー メッセージで中断されます。

[エラー コード: -20448、SQL 状態: 22007] "2017-02-29" は、TIMESTAMP_FORMAT 関数の書式文字列 "YYYY-MM-DD" を使用して解釈できません..SQLCODE=-20448、SQLSTATE=22007

これらのタイムスタンプを例外的に安全に選択するソリューションを探しています。つまり、varchar-timestamp が有効な場合はタイムスタンプに変換する必要があり、「2017-02-29」のように無効な場合は null にする必要があります。戻ってきた。SELECT ステートメントの結果は次のようになります。

2017-02-27 2017-02-27 00:00:00

2017-02-28 2017-02-28 00:00:00

2017-02-29 null

関数timestamp_formatをカプセル化し、たとえばDECLARE CONTINUE HANDLERを介して例外処理のためのロジックを追加するUDFを作成しようとしました。残念ながら、私は今までこの方法で成功しませんでした。

DB2/LINUXX8664 10.5.7 を使用しています。

多分あなたは助けることができます?! よろしくお願いします!

4

3 に答える 3