dft_sqlmathwarn - 算術例外の場合の続行の構成パラメーター

このパラメーターは、演算エラー (ゼロによる割り算など) および検索変換エラーを SQL ステートメント実行時に処理することを決定する値を設定します。

構成タイプ
データベース
パラメーター・タイプ
構成可能
デフォルト [範囲]
いいえ [いいえはい]

静的 SQL ステートメントの場合は、このパラメーターの値は、バインド時にパッケージに 関連付けられます。 動的 SQL データ操作言語 (DML) ステートメントの場合、このパラメーターの値は、ステートメントの準備時に使用されます。

推奨: 算術例外が含まれる照会の処理を特に必要としない限り、デフォルト設定の No を使用してください。 その上で、値 Yes を指定します。 算術例外が含まれる照会の処理が行われる可能性があるのは、発生する算術例外に関係なく他のデータベース・マネージャーで結果が得られる SQL ステートメントを処理する場合です。

制約事項: カラム・オーガナイズ 表がアクセスされる場合、値 Yes はサポートされません。

dft_sqlmathwarn の値の変更による影響

データベースの dft_sqlmathwarn 値を変更した場合は、算術式が組み込まれているチェック制約、トリガー、ビュー、および式ベースのキーを持つ索引の振る舞いが変わることがあります。 この結果、データベースのデータ整合性に影響を及ぼす場合があります。 したがって、データベースの dft_sqlmathwarn 構成パラメーターの設定を変更するのは、算術例外処理の新しい振る舞いがチェック制約、トリガー、ビュー、および式ベースのキーを持つ索引にどのように影響しそうかを入念に評価した後のみにしてください。 dft_sqlmathwarn 構成パラメーターの値を変更した後で、すべての潜在的に影響を受ける式ベースの索引をドロップして再作成します。 影響を受けるかどうか確認できない特定の式ベースの索引がある場合は、索引に間違った値が含まれないようにするため、その索引をドロップして再作成するのが最善です。

割り算の算術演算が組み込まれている、次のチェック制約について考察します。
A/B > 0

dft_sqlmathwarn「No」であるとき、B=0 として INSERT ステートメントを試みると、ゼロによる割り算は演算エラーとして処理されます。 Db2® データベース・マネージャーが制約を検査できないため、挿入操作が失敗します。 dft_sqlmathwarnYes に変更された場合は、ゼロによる割り算は、演算警告として処理され、NULL という結果になります。 NULL という結果では、述部が UNKNOWN に評価され、挿入操作は正常に行われます。 dft_sqlmathwarn が変更されて元の No に戻った場合は、ゼロによる割り算のために Db2 データベース・マネージャーが制約を評価できないため、同じ行を挿入する試みは失敗します。 dft_sqlmathwarnYes に設定されているときに B=0 で挿入された行は表内にとどまり、選択できます。 制約が評価されることになる行の更新は失敗し、制約の再評価を必要としない行の更新は正常に行われます。

dft_sqlmathwarnNo から Yes に変更する場合は、算術式から NULL を明示的に処理するために、あらかじめ制約の書き直しを考慮しておく必要があります。 例えば、A と B が両方とも NULL 可能の場合は、次のコードを使用できます。
  ( A/B > 0 ) AND ( CASE
                      WHEN A IS NULL THEN 1
                      WHEN B IS NULL THEN 1
                      WHEN A/B IS NULL THEN 0
                      ELSE 1
                      END
                    = 1 )

そして、A または B が NULL 可能でない 場合は、対応する IS NULL WHEN 節は除去できます。

dft_sqlmathwarnYes から No に変更する前に、次のような述部を使用して、不整合になる可能性のあるデータがないかどうかを先にチェックしておく必要があります。
   WHERE A IS NOT NULL AND B IS NOT NULL AND A/B IS NULL

不整合行を切り分けたら、不整合を修正するための適切なアクションをとってから dft_sqlmathwarn を変更する必要があります。 また、変更後に算術式を使用して、制約を手動で再チェックすることもできます。 手動で制約をチェックするには、影響を受ける表を SET CONSTRAINTS ステートメントの OFF 節を使用してチェック・ペンディング状態に置いてから、SET CONSTRAINTS ステートメントの IMMEDIATE CHECKED 節を使用して表のチェックを要求します。 不整合データが演算エラーによって示されるので、制約は評価されません。