4.2.4 TAMテーブルへのアクセス手順
- 〈この項の構成〉
(1) TAMテーブルのオープン
C言語のUAPの場合,dc_tam_open関数でTAMテーブルをオープンします※。TAMテーブルをオープンするときは,UAPごとにdc_tam_open関数を呼び出してください。
トランザクションの範囲内でも範囲外でも,TAMテーブルはオープンできます。ただし,トランザクションを開始する前にTAMテーブルをオープンする場合は,そのテーブルに対する排他はできません。TAMテーブルの排他については,「4.2.6 TAMテーブルの排他制御」を参照してください。
TAMテーブルのクローズもテーブル記述子を設定してクローズします※。テーブル記述子は,オープン以降の処理でもUAP内で保持しておいてください。
- 注※
-
COBOL言語でUAPをコーディングする場合は,UAPからTAMテーブルのオープンとクローズはしません。TAMテーブルにアクセスした時点で,該当のTAMテーブルがオープンされて,トランザクションが完了した時点で,該当のTAMテーブルはクローズされます。
(2) レコードの入力/更新/追加/削除手順
TAMテーブルのレコードを参照または更新目的で入力するときは,dc_tam_read関数【CBLDCTAM('FxxR')('FxxU')('VxxR')('VxxU')】を呼び出します。そのとき,別のグローバルトランザクションからの参照または更新を許すかどうかを設定できます。
TAMテーブルのレコードを更新するときは,dc_tam_read関数でレコードを入力したあとに,dc_tam_rewrite関数【CBLDCTAM('MFY ')('MFYS')('STR ')('WFY ')('WFYS')('YTR ')】を呼び出します(入力前提の更新)。
TAMテーブルからレコードを入力しないで,すでにあるレコードに上書きする更新,またはレコードを新規追加する場合は,dc_tam_write関数【CBLDCTAM('MFY ')('MFYS')('STR ')('WFY ')('WFYS')('YTR ')】を呼び出します。
TAMテーブルのレコードを削除する場合は,dc_tam_delete関数【CBLDCTAM('ERS ')('ERSR')('BRS ')('BRSR')】を呼び出します。削除するレコードは,任意のアドレスのバッファに退避できます。退避先のアドレスは,dc_tam_delete関数に設定します。
dc_tam_read関数,またはdc_tam_delete関数のバッファ域,およびdc_tam_rewrite関数,またはdc_tam_write関数のデータ域の先頭を,4バイト境界で設定した場合,設定しない場合に比べて,より高速なアクセスができます。
(3) 複数レコードの一括入出力
複数のキー値(レコード)を,一括して入出力できます。TAMテーブルを入出力するときに,アクセスするキー値を構造体として関数に設定します。この構造体は複数個指定できます。
(4) インデクス種別によるレコードの入力
TAMテーブルからレコードを入力するときは,インデクス種別によって設定できる検索種別が異なります。
-
ハッシュ形式の場合
先頭検索とNEXT検索ができます。これらの検索を使用すると,全レコード検索ができます。最初にdc_tam_read関数(先頭レコード入力を設定)を呼び出して,先頭レコードを入力します。そのキー値以降のレコードは,dc_tam_read関数のNEXT検索で順に入力していきます。
全レコード検索は,TAMテーブルのレコードを全件削除などに使用できます。TAMテーブルのレコードを全件削除する方法を次に示します。
-
先頭検索で先頭レコードを取得する。
-
先頭レコードをキー値に指定してNEXT検索をして,次のレコードを取得する。
-
先頭レコードを削除する。
-
現在取得しているレコードをキー値に指定してNEXT検索をして,次のレコードを取得する。
-
4でキー値に指定したレコードを削除する。
-
次のレコードがなくなるまで4,5の手順を繰り返す。
-
次のレコードがなくなったら,最後のNEXT検索でキー値に指定したレコードを削除する。
この方法は,検索の開始位置としてキー値を指定するので,先頭から指定したキー値の前までの空のハッシュ域は検索しません。そのため,効率良く検索できます。
次の方法はCPUを多く消費するため,レスポンスが遅延する可能性があります。
-
先頭検索で先頭レコードを取得する。
-
先頭レコードを削除する。
-
レコードがなくなるまで1,2の手順を繰り返す。
先頭検索はハッシュ域を先頭から探す処理です。この方法の場合,直前までの処理でレコードを削除して空になったハッシュ域を含めて,毎回先頭からレコードを検索するため,効率が悪く,レスポンスが遅延する可能性があります。
-
-
ツリー形式の場合
設定したキー値に対して「=」,「<=」,「>=」,「<」,および「>」の条件で検索できます。検索後,キー値に該当するレコードを入力します。ある範囲の複数のキー値のレコードを入力するときは,「=」,「<=」,「>=」,「<」および「>」を設定すれば,その条件に該当するレコードを順に入力できます。
(5) TAMテーブルのクローズ
TAMテーブルは,dc_tam_close関数でクローズします。
トランザクションの範囲内でTAMテーブルをオープンしたときは,トランザクション内でクローズしてください。クローズをしないでトランザクションを終了させたときは,OpenTP1でTAMテーブルをクローズします。
トランザクションの範囲外でTAMテーブルをオープンしたときは,トランザクションの外でクローズしてください。トランザクション内でdc_tam_close関数を呼び出すとエラーリターンします。
TAMテーブルのアクセス手順を次の図に示します。
(6) TAMテーブルの状態を取得
オンライン中にTAMテーブルの状態を知りたい場合は,dc_tam_get_inf関数【CBLDCTAM('GST ')】を使います。dc_tam_get_inf関数は,トランザクション処理からでもトランザクションでない処理からでも呼び出せます。dc_tam_get_inf関数では,TAMテーブルが次に示すどの状態かを返します。
-
オープン状態
-
クローズ状態
-
論理閉塞状態
-
障害閉塞状態
dc_tam_get_inf関数を呼び出したUAPがTAMテーブルをオープンしていなくても,ほかのUAPがTAMテーブルをオープンしていれば,dc_tam_get_inf関数はオープン状態を返します。