Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 プログラム作成リファレンス C言語編


dc_tam_delete

〈このページの構成〉

名称

TAMテーブルのレコードの削除

形式

ANSI C ,C++の形式

#include <dctam.h>
int  dc_tam_delete(DCLONG tblid,struct DC_TAMKEY *keyadr,
                   int keyno,
                   char *bufadr,int bufsize,DCLONG flags)

K&R版 C の形式

#include <dctam.h>
int dc_tam_delete(tblid,keyadr,keyno,bufadr,bufsize,flags)
DCLONG           tblid;
struct DC_TAMKEY *keyadr;
int              keyno;
char             *bufadr;
int              bufsize;
DCLONG           flags;

機能

キー値に示すレコードを,TAMテーブルから削除します。削除するレコードをバッファに退避することもできます。ただし,この関数がエラーリターンした場合には,バッファの内容は保証できません。

レコード排他でTAMテーブルがオープンしている場合,更新排他でテーブル排他を確保します。

dc_tam_delete関数がエラーリターンした場合は,この関数内で設定した資源はすべて解放して,関数を呼び出す前の状態に戻ります。ただし,関数を呼び出す前に参照排他で確保されていたTAMテーブルを削除しようとした場合は更新排他となり,参照排他には戻りません。

複数のレコードを設定して削除する場合,それらのレコードのうち一つでもエラーが起こったときは,この関数で設定した全レコードの処理をエラーとして,関数を呼び出す前の状態に戻ります。

UAPで値を設定する引数

●tblid

レコードを削除するTAMテーブルの,テーブル記述子を設定します。テーブル記述子は,dc_tam_open関数で返された値です。

●keyadr

削除するレコードのキー値のアドレスを持つ,構造体のアドレスを設定します。構造体の形式は次のとおりです。

struct DC_TAMKEY {
                   char  *keyname;
                  };
  • keyname

    キー値のアドレスを設定します。キー値は,削除するレコードのキー領域の長さで設定してください。

●keyno

要求レコード数(keyadrで設定する構造体の数)を設定します。

●bufadr

削除するレコードをバッファに退避する場合に,そのバッファのアドレスを設定します。flagsにDCTAM_NOOUTREC(削除するレコードを退避しない)を設定した場合は,この設定は無効です。

●bufsize

削除するレコードをバッファに退避する場合に,そのバッファ長を設定します。返却バッファ長は,(レコード長×要求レコード数)以上にします。flagsにDCTAM_NOOUTREC(削除するレコードを退避しない)を設定した場合は,この設定は無効です。

●flags

レコードのアクセス種別,資源の競合が起こった場合の排他解除待ち種別を,次の形式で設定します。

{DCTAM_NOOUTREC|DCTAM_OUTREC}〔|{DCTAM_WAIT|DCTAM_NOWAIT}〕
  • フラグ1

    レコードのアクセス種別の設定は省略できません。アクセス種別は重複して設定できません。

    DCTAM_NOOUTREC … 削除するレコードを退避しない。

    DCTAM_OUTREC … 削除するレコードを退避する。

  • フラグ2

    排他解除待ち種別を省略した場合は,排他解除待ちをしないでエラーリターンします。排他解除待ち種別は重複して設定できません。

    DCTAM_WAIT… 排他解除待ちをします。

    DCTAM_NOWAIT… 待たないで,エラーリターンします。

リターン値

リターン値

リターン値(数値)

意味

DC_OK

0

TAMテーブルのレコードを正常に削除しました。

DCTAMER_PARAM_TID

-1700

tblidに設定したテーブル記述子が間違っています。

DCTAMER_PARAM_KEY

-1702

keyadrに設定したキー値が間違っています。

DCTAMER_PARAM_KNO

-1703

keynoに設定した値が間違っています。

DCTAMER_PARAM_BFA

-1704

bufadrに設定した値が間違っています。

DCTAMER_PARAM_BFS

-1705

bufsizeに設定したバッファ長が短過ぎます。

DCTAMER_PARAM_FLG

-1708

flagsに設定した値が間違っています。

DCTAMER_NOTTAM

-1709

tblidに設定したテーブルはTAMテーブルではありません。

DCTAMER_TAMEND

-1720

TAMサービスが終了中です。

DCTAMER_PROTO

-1721

TAMテーブルへアクセスする順序が間違っています。

UAPにリンケージしているトランザクション制御用オブジェクトファイルのリソースマネジャ登録が間違っています。

または,UAPにトランザクション制御用オブジェクトファイルをリンケージしていません。

関数を呼び出したUAPのユーザサービス定義に,トランザクション属性なし(atomic_update=N)を指定しています。

DCTAMER_RMTBL

-1723

TAMテーブルが削除されています。

DCTAMER_NOLOAD

-1724

TAMテーブルがロードされていません。

DCTAMER_NOOPEN

-1726

TAMテーブルがオープン状態ではありません。

DCTAMER_LOGHLD

-1727

TAMテーブルが論理閉塞状態です。

DCTAMER_OBSHLD

-1728

TAMテーブルが障害閉塞状態です。

DCTAMER_ACSATL

-1730

TAMサービス定義で指定したTAMテーブルのアクセス形態では実行できません。

DCTAMER_NOREC

-1731

指定されたレコードは存在しません。

DCTAMER_LOCK

-1736

排他エラーが起こりました。flagsにDCTAM_WAITを設定した場合,ロックサービス定義で指定した待ち時間のタイムアウトのため,資源を確保できませんでした。

DCTAMER_DLOCK

-1737

デッドロックが起こりました。

DCTAMER_TBLVR

-1760

UAPが,現在稼働しているTAMテーブルでは動作できないバージョンのTAMライブラリと結合されています。

DCTAMER_FLSVR

-1761

UAPが,現在稼働しているOpenTP1ファイルサービスでは動作できないバージョンのTAMライブラリと結合されています。

DCTAMER_RECOBS

-1764

レコードが破壊されています。

DCTAMER_TRNNUM

-1765

TAMサービスで管理できるトランザクション数を超えました。

DCTAMER_OPENNUM

-1766

キャラクタ型スペシャルファイルのオープン数の制限値を超えました。

DCTAMER_ACCESSS

-1767

スペシャルファイルに対するアクセス権がありません。

DCTAMER_ACCESSF

-1768

TAMファイルに対するアクセス権がありません。

DCTAMER_MEMORY

-1769

メモリが不足しました。

DCTAMER_IO

-1770

入出力エラーが起こりました。

DCTAMER_TMERR

-1771

トランザクションサービスでエラーが起こりました。

DCTAMER_ACCESS

-1773

アクセスしようとしたTAMファイルは,セキュリティ機能で保護されています。dc_tam_delete関数を呼び出したUAPには,アクセス権限がありません。

注意事項

ハッシュ形式のTAMテーブルに格納されているレコードを全件削除する場合,次の手順で行ってください。

  1. 先頭検索して見つかったレコードのキー値を変数1に退避する

  2. 変数1のキー値を使い,NEXT検索する

  3. 手順2.で見つかったレコードのキー値を変数2に退避する

  4. 退避しておいた変数1のキー値のレコードを削除する

  5. 変数2のキー値を変数1に退避する

  6. 手順2.がエラーになるまで手順2.から手順5.を繰り返す(NEXT検索する)

  7. 手順2.がエラーになったあとで,最後に変数1に退避したキー値のレコードを削除する

レコードを全件削除する場合,次に示す手順を実行するとCPUが高負荷になることがありますので注意してください。

  1. レコードを先頭検索する

  2. 手順1.で見つかったレコードを削除する

  3. 手順1.と手順2.すなわちレコードの先頭検索とレコードの削除を繰り返す