SQLCA (SQL 連絡域)

SQLCA は、すべての SQL ステートメントのそれぞれ実行の終了時に更新される変数の集まりです。

実行可能な SQL ステートメントを収めていて、 オプション LANGLEVEL SAA1 (デフォルト) または MIA を指定してプリコンパイルされたプログラムは、 1 つだけの SQLCA を用意する必要があります。 ただし、マルチスレッドのアプリケーションでは、スレッドごとに 1 つの SQLCA を用意し、 その結果 SQLCA が複数になることがあります。

オプション LANGLEVEL SQL92E を指定してプログラムをプリコンパイルした場合、 SQLCODE 変数または SQLSTATE 変数を SQL 宣言セクションで宣言することができ、 また SQLCODE 変数をプログラムで宣言することができます。

LANGLEVEL SQL92E を使用すると、SQLCA は用意されません。 SQL INCLUDE ステートメントを使用すると、REXX 以外のすべての言語で SQLCA の宣言を行うことができます。 SQLCA は自動的に REXX で提供されます。

コマンド行プロセッサーを介して実行された各コマンドの後に SQLCA を表示するには、コマンド db2 -aを発行します。 これにより、SQLCA は後続のコマンドの出力の一部として表示されます。 同時に SQLCA は db2diag ログ・ファイルにダンプされます。

SQLCA フィールド記述

表 1. SQLCAのフィールド。 この表によって示されているフィールド名は、 INCLUDE ステートメントによって得られる SQLCA のものです。
名前 データ型 (Data Type) フィールド値
sqlcaid CHAR(8) SQLCA を含む、ストレージ・ダンプの目印。 SQL ルーチン、SQL トリガー、または動的コンパウンド SQL ステートメントの構文解析から行番号情報が返される場合、6 番目のバイトは L になります。 コンパイル済み SQL ルーチン、コンパイル済み SQL トリガー、または動的コンパウンド SQL (コンパイル済み) ステートメントの実行から行番号およびオブジェクト ID の情報が返される場合、6 番目のバイトは M になります。
sqlcabc INTEGER SQLCA の長さ (136) が入ります。
sqlcode INTEGER SQL 戻りコードが入ります。
0
正常に実行された (1 つ以上の SQLWARN 標識が設定される場合があります)。
正の値
正常に実行されたが、警告状態である。
負の値
エラー状態。
sqlerrml SMALLINT sqlerrmc の長さ標識 (0 から 70 の範囲)。0 は、sqlerrmc の値が関係ないことを意味します。
sqlerrmc VARCHAR (70) エラー条件の説明の中の変数を置き換える 1 つまたは複数のトークンが入り、各トークンは X'FF' で区切られます。

このフィールドは、正常に接続が完了した場合にも使用されます。

NOT ATOMIC コンパウンド SQL ステートメントが発行されると、7 つ以下のエラーに関する情報を入れることができます。

最後のトークンの後に X'FF' が続くことがあります。 sqlerrml の値には、後続の X'FF' が含まれます。

sqlerrp CHAR(8) V11.1 より、SQLERRP フィールドの形式が SQLvvrrmm に変更されました。この意味は次のとおりです。
  • vv はバージョン番号を表します
  • rr はリリース番号を表します
  • m はモディフィケーション値を表します

以下の例では、製品シグニチャーと SQLERRP フィールドの新規トークンとの関係を示しています。 モディフィケーション・パックのどの後続フィックスパックでも、同じ SQLERRP 値が戻されます。

Product           SQLERRP
signature         token
Db2 10.5.0.7      SQL10057
Db2 11.0.0.0      SQL11010
Db2 11.1.1.1      SQL11011
Db2 11.1.2.0      SQL11012
sqlerrd ARRAY 診断情報の提供に使用される 6 個の INTEGER 変数。 これらの値は、エラーがない場合は通常は空ですが、パーティション・データベースの sqlerrd(6) は例外です。
sqlerrd(1) INTEGER 接続が正常に起動された場合、 アプリケーションのコード・ページからデータベースのコード・ページに変換する際に予想される 混合文字データ (CHAR データ・タイプ) の長さの差の最大値が入ります。 0 または 1 の値は、長さが変わらないことを示し、1 より大きい値は長さが長くなることを、 負の値は切り捨てが生じることを示します。

SQL プロシージャーから正常に戻された場合、その SQL プロシージャーからの戻り状況値が入ります。

sqlerrd(2) INTEGER

接続が正常に起動された場合、 データベースのコード・ページからアプリケーションのコード・ページに変換する際に予想される 混合文字データ (CHAR データ・タイプ) の長さの差の最大値が入ります。 0 または 1 の値は、長さが変わらないことを示し、1 より大きい値は長さが長くなることを、 負の値は切り捨てが生じることを示します。 SQLCA がエラーの発生した NOT ATOMIC コンパウンド SQL ステートメントの結果である場合、 この値はエラーの発生したステートメントの番号に設定されます。

sqlerrd(3) INTEGER PREPARE を呼び出して正常に実行した場合は、 戻される行の数の見積もりが入ります。 INSERT、UPDATE、DELETE、または MERGE を実行した後は、 実際にその操作のために修飾された行の数になります。 TRUNCATE ステートメントの場合、値は -1 になります。 コンパウンド SQL を呼び出した場合は、すべてのサブステートメント行の累計が入ります。 CONNECT が呼び出され、データベースが更新可能な場合は 1、 データベースが読み取り専用の場合は 2 が入ります。

OPEN ステートメントが呼び出され、カーソルに SQL データ変更ステートメントが入っている場合、 このフィールドには、組み込まれた挿入、更新、削除、 またはマージ操作のために修飾された行の合計が入ります。

SQL ルーチン、トリガー、または動的コンパウンド SQL (インライン化またはコンパイル済み) ステートメントのコンパイル中にエラーが発生した場合、sqlerrd(3) には、エラーが発生した行番号が含まれます。 有効な行番号を表すために、この項目の sqlcaid の 6 バイト目は必ず L になります。

コンパイル済み SQL ルーチン、トリガー、または動的 SQL (コンパイル済み) ステートメントの実行中にエラーが発生した場合、sqlerrd(3) には、エラーが発生した行番号が含まれます。 有効な行番号を表すために、sqlcaid の 6 バイト目は必ず M になります。

sqlerrd(4) INTEGER

PREPARE が正常に呼び出された場合、ステートメントを処理するのに必要なリソースの 相対コスト見積もりが入ります。 コンパウンド SQL を呼び出した場合は、 正常に実行されたサブステートメントの数のカウントが入ります。 CONNECT を呼び出した場合は、 最新レベルにないクライアントからの 1 フェーズ・コミットなら 0、 1 フェーズ・コミットなら 1、1 フェーズの読み取り専用コミットなら 2、 2 フェーズ・コミットなら 3 が入ります。

コンパイル済み SQL ルーチンまたはトリガーの実行中にエラーが発生した場合、sqlerrd(4) には、エラーが発生したルーチンまたはトリガーを一意的に識別する整数が含まれます。 有効な行番号を表すために、この項目の sqlcaid の 6 バイト目は必ず M になります。

sqlerrd(5) INTEGER
以下の両方の結果として削除、挿入、または更新された行の総数。
  • 削除操作成功後の制約の強制
  • アクティブにされたインライン・トリガーからのトリガー SQL ステートメントの処理
コンパウンド SQL が呼び出される場合は、すべてのサブステートメントの、これに該当する行の数の集計が含まれます。 場合によっては、エラーが発生したときに、内部エラーを示す負の値がこのフィールドに表示されることがあります。 CONNECT を呼び出した場合は、以下の認証タイプ値が入ります。
  • 0 はサーバー認証
  • 1 はクライアント認証
  • 2 ( Db2® Connect を使用した認証)
  • 4 は SERVER_ENCRYPT 認証
  • 5: Db2 Connect を使用した暗号化による認証。
  • 7 は KERBEROS 認証
  • 9 は GSSPLUGIN 認証
  • 11 は DATA_ENCRYPT 認証
  • 255 は未指定の認証
重要: DATA_ENCRYPT 認証タイプは非推奨になっており、将来のリリースで除去される可能性があります。 クライアントと Db2 データベースの間で転送中のデータを暗号化するには、 トランスポート層セキュリティー (TLS)Db2 データベース・システム・サポートを使用することをお勧めします。 詳しくは、「 転送中のデータの暗号化」を参照してください。
sqlerrd(6) INTEGER パーティション・データベースの場合、エラーまたは警告が出されたデータベース・パーティションのパーティション番号が入ります。 エラーまたは警告が出されなかった場合は、 このフィールドにはコーディネーター・パーティションのパーティション番号が入ります。 このフィールドに入る番号は、 db2nodes.cfg ファイルでデータベース・パーティションに対して指定されたものと同じです。
sqlwarn 配列 一連の警告標識。各標識はブランクまたは W です。 コンパウンド SQL が呼び出された場合、すべてのサブステートメントについての警告標識の累積が含まれます。
sqlwarn0 CHAR(1) 他のすべての標識がブランクの場合はブランク、1 つでもブランクでない標識があれば W になります。
sqlwarn1 CHAR(1) ホスト変数への割り当て時にストリング列の値が切り捨てられた場合は、W になります。 NULL 終止符が切り捨てられた場合は、N になります。 CONNECT または ATTACH が正常に実行され、接続の許可名が 8 バイトを超える場合は A になります。 sqlerrd(4) 内に保管されている PREPARE ステートメントの相対コスト見積もりが、INTEGER 内に保管できる値を超える場合や、1 未満であった場合に、CURRENT EXPLAIN MODE または CURRENT EXPLAIN SNAPSHOT 特殊レジスターが NO 以外の値に設定されていると、P になります。
sqlwarn2 CHAR(1) 集約関数の引数から NULL 値が除去された場合は、W になります。 a

CONNECT が呼び出され、正常に実行された場合に、データベースが静止状態であれば D が入り、インスタンスが静止状態であれば I が入ります。

sqlwarn3 CHAR(1) 列の数とホスト変数の数が等しくない場合、W が入ります。 ASSOCIATE LOCATORS ステートメントに指定されている結果セット・ロケーターの数が、プロシージャーから返された結果セットの数より少ない場合は、Z が入ります。
sqlwarn4 CHAR(1) 準備された UPDATE または DELETE ステートメントに WHERE 節が含まれていない場合、W が入ります。
sqlwarn5 CHAR(1) SQL ステートメントの実行中にエラーが許容された場合は、 E が入ります。
sqlwarn6 CHAR(1) 存在しない日付を避けるために日付演算の結果が調整された場合は、W が入ります。
sqlwarn7 CHAR(1) CONNECT が呼び出され、正常に実行された場合は、B (サーバーが BigSQL の場合) または "D" (サーバーが Db2 Warehouse on Cloud の場合) が入ります。
sqlwarn8 CHAR(1) 変換できなかった文字が置換文字に置き換えられた場合、W が入ります。 トラステッド接続を確立しようとして失敗した場合は、Y が入ります。
sqlwarn9 CHAR(1) 集約関数の処理中にエラーのある算術式が無視された場合は、W が入ります。
sqlwarn10 CHAR(1) SQLCA のいずれかのフィールドの文字データ値を変換するときに変換エラーがあった場合は、W が入ります。
SQLSTATE CHAR(5) 直前に実行された SQL ステートメントの結果を示す戻りコード。

a 一部の関数では、NULL 値が除去されても SQLWARN2 が W にならないことがあります。 これは、結果が NULL 値の除去によるものでない場合に生じます。

エラー報告

エラー報告の順序は、次のとおりです。

  1. 重大エラー条件は必ず報告されます。 重大エラーが報告される場合、SQLCA に追加されるものはありません。
  2. 重大エラーが発生しなかった場合、 デッドロック・エラーはその他のエラーよりも優先します。
  3. その他のエラーの場合、最初の負の SQL コードの SQLCA が戻されます。
  4. 負の SQL コードが検出されない場合、 最初の警告の SQLCA (つまり正の SQL コード) が戻されます。

    パーティション・データベース・システムで、あるデータベース・パーティションでは空で、他のデータベース・パーティションにはデータがある表に対してデータ操作コマンドが呼び出される場合は、この規則の例外です。 すべてのデータベース・パーティションで表が空であるため、または UPDATE ステートメントの WHERE 節の条件を満たす行がもうないために、すべてのデータベース・パーティションのエージェントが SQL0100W を返した場合のみ、アプリケーションに SQLCODE +100 が返されます。

パーティション・データベース・システムでの SQLCA の使用法

パーティション・データベース・システムでは、異なるデータベース・パーティションにある多くのエージェントが 1 つの SQL ステートメントを実行する場合があり、それぞれのエージェントが異なるエラーまたは警告についての異なる SQLCA を戻す場合があります。 また、コーディネーターのエージェントには独自の SQLCA があります。

アプリケーションについての表示に一貫性を持たせるために、 SQLCA の値はすべて 1 つの構造の中に組み合わされ、 SQLCA のフィールドは以下のようにグローバルなカウントを表示します。
  • エラーと警告のすべてについて、sqlwarn フィールドには すべてのエージェントから受け取った警告標識が入ります。
  • 行カウントを表示する sqlerrd フィールドの値は、 すべてのエージェントからの累計です。
注: トリガーされた SQL ステートメントの処理中にエラーが発生するたびに SQLSTATE 09000 が戻されるとは限りません。