スケーラブルデータベースサーバ HiRDB Version 8 UAP開発ガイド

[目次][索引][前へ][次へ]

3.6.1 エラーの判定

<この項の構成>
(1) リターンコードの参照
(2) エラー検出時の対処

(1) リターンコードの参照

SQL実行時にHiRDBシステムでリターンコード(SQLCODE,及びSQLSTATE)が設定されます。ただし,DECLARE CURSORのような宣言文の場合は,リターンコードが設定されません。リターンコードを参照する場合の変数名称は,次のとおりです。

SQLCODE変数,及びSQLSTATE変数の設定値を参照することで,SQL文の実行状態が判定できます。

SQL文の実行状態と変数に設定される値の関係を次の表に示します。

表3-28 SQL文の実行状態と変数に設定される値の関係

SQL文の実行状態 SQLCODE変数の値 SQLWARN0の値 SQLWARN6の値 SQLSTATE変数の値
正常終了 警告なし 0 '△' '00000'
警告付き※4 0 'W' '01nnn'※1
(nnn≠R00)
>0(≠100,110) 'R01R00'
データなし※3 110 'R2000'
データなし 100 '02000'
エラー終了 暗黙的ロールバックなし -1〜-1999 '△' 'mmnnn'※2
暗黙的ロールバックあり -1〜-1999 'W' 'W' '40nnn'※1

(凡例)
mm:クラス
nnn:サブクラス
−:値は設定されません。

注※1
nnnには,SQLSTATEのサブクラスが設定されます。SQLSTATEについては,マニュアル「HiRDB Version 8 メッセージ」を参照してください。

注※2
mmには,SQLSTATEのクラスが設定されます。SQLSTATEについては,マニュアル「HiRDB Version 8 メッセージ」を参照してください。

注※3
リストを使用した検索で,リスト作成時にあった行が返らなかった場合の状態です。

注※4
警告情報の内容は,SQLWARN1〜Fに設定されるか,又はSQLCODEの値(100以外の正数)で示されます。SQLWARN1〜Fに警告情報が設定される場合は,SQLWARN0に'W'が設定されます。SQLWARN0に'W'が設定されている場合,更にSQLWARN1〜Fの領域を確認します。
なお,SQLWARN0〜Fの内容については,「付録A SQL連絡領域」を参照してください。
警告情報の内容をSQLCODEの値(100以外の正数)で示す場合は,SQLSTATEのサブクラス(nnn)がR00になります。警告付き正常終了の場合のSQLSTATE,SQLCODE,及びSQLWARNOの値の関係を次の表に示します。

表3-29 警告付き正常終了の場合のSQLSTATE,SQLCODE,及びSQLWARNOの値の関係

SQLSTATEの値 SQLCODEの値 SQLWARNOの場合
01nnn(nnn≠R00) 0 'W'
01R00 100以外の正数 空白,又は'W'
(a) SQLCODE=100,又はSQLSTATE='02000'の場合

検索する行がなくなったことを判定します。

特に次に示す内容を判定するときに有効です。

(b) SQLCODE<0,又はSQLSTATE='mmnnn'(mmが'00','01','02'でない,又はリストを使用した検索の場合はmmが'00','01','02','R2'でない)の場合

SQLエラーが発生したと判定します。

SQLエラーが発生した場合,暗黙的にロールバックされる場合とされない場合があります。SQLWARN6='W',又はSQLSTATE='40nnn'の場合,暗黙的にロールバックしたと判定します。

なお,エラーが発生したSQLを特定したい場合,SQLトレース情報を参照します。SQLトレース情報の内容については,「11.1.1 SQLトレース機能」を参照してください。

(c) 上記の(a)及び(b)以外の場合

正常終了したと判定します。

正常終了には,警告情報がある場合とない場合があります。SQLWARN0='W',若しくはSQLCODEが100以上の正の値,又はSQLSTATE='01nnn'の場合,警告付き正常終了と判定します。

リストを使用した検索の場合,データなしの正常終了(リスト作成時にあった行が削除された)の可能性があります。SQLCODEが110,又はSQLSTATEが'R2000'ならば,データなしの正常終了と判断して,検索行に対する処理をスキップする必要があります。

警告付き正常終了の内容については,表3-29を参照してください。

(2) エラー検出時の対処

エラーを検知した場合,次に示す1〜4の順番で対処します。

  1. リターンコードを出力,又は表示します。
  2. リターンコードだけではエラーの内容が判別しにくい場合,各コードの付加情報を表示,又は出力します。また,必要に応じて,エラーになったSQL文,又はエラーになったSQL文を識別するための情報を表示します。
    リターンコードの付加情報と参照先を次の表に示します。

    表3-30 リターンコードの付加情報と参照先

    付 加 情 報  参 照 先
    SQLCODEに対応するメッセージ SQL連絡領域中のSQLERRMLフィールド,及びSQLERRMCフィールドの内容
    分散システム使用時の自RDノードでのエラーかそれ以外のエラーかを区別するための情報 SQL連絡領域中のSQLCAIDEフィールドの内容

注※
エラーが発生した後に再度FETCH文を実行した場合,HiRDBは前回発生したエラーのリターンコードを返しますが,メッセージの可変部の内容は保証しません。

 

  1. トランザクションを取り消します(ROLLBACK,又はUAPを異常終了させます)。
    デッドロックによって暗黙的にロールバックされたUAPは次のようになります。
    通常のUAPの場合:
    暗黙的にロールバックされると,次に実行したSQLが新たなトランザクション開始となります(ROLLBACK,又はDISCONNECTもできます)。
    OLTP下のUAPの場合:
    暗黙的にロールバックされると,OLTP下のUAPからはDISCONNECT,又はROLLBACK以外は受け付けられません。
    また,OLTP環境でX/Openに従ったアプリケーションプログラムをクライアントとした場合に,実行したアプリケーションプログラムがデッドロックになったときもトランザクションの終了が必要です。
  2. UAPの終了,又はトランザクションの開始(別のトランザクションの新規実行,又は同じトランザクションの再実行)をします。
    なお,同じトランザクションを再実行する場合,実行前にエラーの対策をしてください。エラーの原因が取り除かれない状態でトランザクションを再実行すると,無限ループになることもあります。また,再実行しても同一のエラーが発生するような場合,UAPの終了を考慮する必要があります。