レコードがロックされているI/O状況

I/Oコマンド戻りコード表 の戻りコードに加え、システム変数*DBMS_RECORD_LOCKEDを使用して、レコードがロックされているI/Oエラー状況とその他のI/Oエラーを区別することができます。

次の例では、エラーが発生した場合、およびコマンドが成功したときにGOTO NXTがIF条件をバイパスした場合にIO_ERRORパラメータがラベルTSTにどのように制御を渡すかを示しています。 

          UPDATE    FIELDS(#ORDERQTY) IN_FILE(ORDLINE)
                WITH_KEY(#ORDER #LINE) IO_ERROR(TST)
      GOTO      LABEL(NXT)
TST  IF        COND('*DBMS_RECORD_LOCKED *EQ Y')
      MESSAGE   MSGTXT('Order line record locked')
      ........  ..Required action
      ELSE
      ABORT     MSGTXT('Fatal I/O error on ORDERLINE file')
      ENDIF
NXT  .......   ..Next action

コメント/警告 

リリース7.0より前にコンパイルされたファイルでこの方法を使用する場合、最初にI/Oモジュールを再コンパイルする必要があります。 

IO_ERRORパラメータは指定のラベルに制御を渡すため、条件には、上記の例のように、レコードがロックされていないI/Oエラーを処理するための適切なアクションが指定されたELSEコマンドが必ず必要です。 

DBMS_RECORD_LOCKEDでは、コマンドの処理対象であるファイルの状況だけがチェックされます。上記の例でバッチ制御ロジックが使用されていて、バッチ制御レコードがロックされた場合、*DBMS_RECORD_LOCKEDは値Nを戻します。同じことがトリガーによって使用されるファイルにも当てはまります。トリガーによって使用されるファイルに対して、レコードのロック状況をチェックする場合、上記のロジックをトリガー・ファンクションに挿入する必要があります。

移植性に関する考慮事項

IBM i: 一定の時間がたつと、自動的にファイルをアンロックします。

IBM i以外::デフォルトでは、この機能はエミュレートされ、無効になっています。詳細は、ロック・タイムアウト を参照してください。

  • No labels