DB2 Version 10.1 for Linux, UNIX, and Windows

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

このパラメーターは、演算エラーおよび検索変換エラーを SQL ステートメント実行時のエラーまたは警告として処理することを決定する、デフォルト値を設定します。

構成タイプ
データベース
パラメーター・タイプ
構成可能
デフォルト [範囲]
No [No, Yes]

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

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

dft_sqlmathwarn を変更した場合の影響

データベースの dft_sqlmathwarn 値を変更した場合は、算術式が組み込まれているチェック制約、トリガー、およびビューの振る舞いが変更されることがあります。 この結果、データベースのデータ整合性に影響を及ぼす場合があります。 したがって、データベースの dft_sqlmathwarn の設定を変更するのは、 新しい演算例外処理の振る舞いがチェック制約、トリガー、およびビューにどのように影響するかを入念に評価した後のみに限る必要があります。一度変更すると、その後の変更でも同じく入念な評価が必要です。

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

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

dft_sqlmathwarnNo から Yes に変更する場合は、算術式から 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 可能な場合です。そして、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 節によって) チェック されるよう要求します。不整合データが演算エラーによって示されるので、制約は評価されません。