3.6.1 エラーの判定
- 〈この項の構成〉
(1) リターンコードの参照
SQL実行時にHiRDBシステムでリターンコード(SQLCODE,及びSQLSTATE)が設定されます。ただし,DECLARE CURSORのような宣言文の場合は,リターンコードが設定されません。リターンコードを参照する場合の変数名称は,次のとおりです。
-
SQLCODEを参照する場合の変数名称:SQLCODE
-
SQLSTATEを参照する場合の変数名称:SQLSTATE
SQLCODE変数,及びSQLSTATE変数の設定値を参照することで,SQL文の実行状態が判定できます。
SQL文の実行状態と変数に設定される値の関係を次の表に示します。
- (凡例)
-
mm:クラス
nnn:サブクラス
−:値は設定されません。
- 注※1
-
nnnには,SQLSTATEのサブクラスが設定されます。SQLSTATEについては,マニュアル「HiRDB メッセージ」を参照してください。
- 注※2
-
mmには,SQLSTATEのクラスが設定されます。SQLSTATEについては,マニュアル「HiRDB メッセージ」を参照してください。
- 注※3
-
リストを使用した検索で,リスト作成時にあった行が返らなかった場合の状態です。
- 注※4
-
警告情報の内容は,SQLWARN1〜Fに設定されるか,又はSQLCODEの値(100以外の正数)で示されます。SQLWARN1〜Fに警告情報が設定される場合は,SQLWARN0に'W'が設定されます。SQLWARN0に'W'が設定されている場合,更にSQLWARN1〜Fの領域を確認します。
なお,SQLWARN0〜Fの内容については,「SQL連絡領域」を参照してください。
警告情報の内容をSQLCODEの値(100以外の正数)で示す場合は,SQLSTATEのサブクラス(nnn)がR00になります。警告付き正常終了の場合のSQLSTATE,SQLCODE,及びSQLWARNOの値の関係を次の表に示します。
表3‒32 警告付き正常終了の場合のSQLSTATE,SQLCODE,及びSQLWARNOの値の関係 SQLSTATEの値
SQLCODEの値
SQLWARNOの場合
01nnn(nnn≠R00)
0
‘W’
01R00
100以外の正数
空白,又は’W’
(a) SQLCODE=100,又はSQLSTATE='02000'の場合
検索する行がなくなったことを判定します。
特に次に示す内容を判定するときに有効です。
-
FETCH文で取り出す行がなくなった
-
1行SELECT文で行がなかった
-
INSERT文,DELETE文,又はUPDATE文で更新対象の行がなかった
(b) SQLCODE<0,又はSQLSTATE='mmnnn'(mmが'00','01','02'でない,又はリストを使用した検索の場合はmmが'00','01','02','R2'でない)の場合
SQLエラーが発生したと判定します。
SQLエラーが発生した場合,暗黙的にロールバックされる場合とされない場合があります。SQLWARN6='W',又はSQLSTATE='40nnn'の場合,暗黙的にロールバックしたと判定します。
なお,エラーが発生したSQLを特定したい場合,SQLトレース情報を参照します。SQLトレース情報の内容については,「SQLトレース機能」を参照してください。
(c) 上記の(a)及び(b)以外の場合
正常終了したと判定します。
正常終了には,警告情報がある場合とない場合があります。SQLWARN0='W',若しくはSQLCODEが100以上の正の値,又はSQLSTATE='01nnn'の場合,警告付き正常終了と判定します。
リストを使用した検索の場合,データなしの正常終了(リスト作成時にあった行が削除された)の可能性があります。SQLCODEが110,又はSQLSTATEが'R2000'ならば,データなしの正常終了と判断して,検索行に対する処理をスキップする必要があります。
警告付き正常終了の内容については,表「警告付き正常終了の場合のSQLSTATE,SQLCODE,及びSQLWARNOの値の関係」を参照してください。
(2) エラー検出時の対処
エラーを検知した場合,次に示す1〜4の順番で対処します。
-
リターンコードを出力,又は表示します。
-
リターンコードだけではエラーの内容が判別しにくい場合,各コードの付加情報を表示,又は出力します。また,必要に応じて,エラーになったSQL文,又はエラーになったSQL文を識別するための情報を表示します。
リターンコードの付加情報と参照先を次の表に示します。
表3‒33 リターンコードの付加情報と参照先 付加情報
参照先
SQLCODEに対応するメッセージ※
SQL連絡領域中のSQLERRMLフィールド,及びSQLERRMCフィールドの内容
-
トランザクションを取り消します(ROLLBACK,又はUAPを異常終了させます)。
デッドロックによって暗黙的にロールバックされたUAPは次のようになります。
- 通常のUAPの場合:
-
暗黙的にロールバックされると,次に実行したSQLが新たなトランザクション開始となります(ROLLBACK,又はDISCONNECTもできます)。
- OLTP下のUAPの場合:
-
暗黙的にロールバックされると,OLTP下のUAPからはDISCONNECT,又はROLLBACK以外は受け付けられません。
また,OLTP環境でX/Openに従ったアプリケーションプログラムをクライアントとした場合に,実行したアプリケーションプログラムがデッドロックになったときもトランザクションの終了が必要です。
-
UAPの終了,又はトランザクションの開始(別のトランザクションの新規実行,又は同じトランザクションの再実行)をします。
なお,同じトランザクションを再実行する場合,実行前にエラーの対策をしてください。エラーの原因が取り除かれない状態でトランザクションを再実行すると,無限ループになることもあります。また,再実行しても同一のエラーが発生するような場合,UAPの終了を考慮する必要があります。