Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 TP1/Server Base Enterprise Option プログラム作成の手引


CBLEEDBQ('MSGGET ')

〈このページの構成〉

名称

メッセージの読み出し

形式

PROCEDURE DIVISIONの指定

CALL 'CBLEEDBQ' USING 一意名1 一意名2 一意名3

DATA DIVISIONの指定

01 一意名1.
   02 データ名A  PIC X(8) VALUE 'MSGGET  '.
   02 データ名B  PIC X(5).
   02 FILLER    PIC X(3).
   02 データ名C  PIC S9(9) COMP VALUE ZERO.
   02 データ名D  PIC X(28).
01 一意名2.
   02 データ名E  PIC 9(9) COMP-X.
   02 FILLER     PIC X(68).
   02 データ名F  PIC X(n).
01 一意名3.
   02 データ名G  PIC 9(9) COMP.
   02 データ名H  PIC 9(9) COMP.

機能

メッセージを読み出します。

メッセージをDBキューから読み出すためのSQLの実行は,この関数内で行います。このときのSQLは,SQL実行中だけ排他を取ります。

メッセージを読み出し済みに更新するためのSQLの実行は,トランザクションの同期点処理内で行います。1トランザクションで複数のDBキューに対してこの関数を実行した場合は,API関数の実行順序に関係なく,DBキュー名の昇順にSQLを実行します。そのため,複数のDBキューに対してこの関数を実行するトランザクション間でこの関数の実行順序が異なっても,実行順序が原因でデッドロックすることはありません。

同一グローバルトランザクションのトランザクションブランチ間でこのAPI関数を実行すると,デッドロックが発生する場合があります。詳細は「注意事項」を参照してください。

UAPで値を設定するデータ領域

●データ名A

メッセージの読み出し要求を示す要求コードを「VALUE 'MSGGET△△'」と設定します。

●データ名C

0を設定します。

●データ名D

読み出し対象となるDBキュー名を,27バイト以内のアスキー文字列で設定します。文字列の最後には,空白を設定してください。この空白は文字列の長さに数えません。

●データ名E

読み出したメッセージを格納する領域の長さを設定します。1〜8388608の値を指定してください。

●データ名F

読み出したメッセージを格納する領域を設定します。

TP1/EEから値が返されるデータ領域

●データ名F

読み出したメッセージが返されます。

●データ名G

読み出したメッセージの長さが返されます(単位:バイト)。

[図データ]

読み出したメッセージがオーバフローしてしまう場合(ステータスコード05620)でも,データ名Eで指定した長さにかかわらず,読み出したメッセージの長さが返されます。この場合,オーバフローしたメッセージは読み出し成功として動作します。

[図データ]

●データ名H

読み出したメッセージの通番が返されます。

●データ名B

ステータスコードが,5けたの数字で返されます。

ステータスコード

ステータスコード

意味

00000

正常に終了しました。

00001

TP1/EEの環境下にありません。

00004

UOCから発行しているため,この機能は使用できません。

00005

オフラインバッチプロセスから発行しているため,この機能は使用できません。

05601

データ名に設定した値が間違っています。

05602

DBキュー機能は使用できません。

05603

この関数を呼び出せる状態ではありません。

  • 通番の初期化中です。

  • スキップ処理中です。

05604

要求されたDBキューは存在しません。

05605

該当するスレッドではリソースマネジャに接続されていません。

05606

バッファ長が指定範囲外です。

05607

DBキューが使用できない状態です。

05609

リソースマネジャアクセス時にエラーが発生しました。

05616

設定されたDBキューのタイプは機能対象外です。

  • 相手読み出しDBキュー

05620

読み出したメッセージがバッファをオーバフローしました。読み出し成功として動作します。

05621

関数の呼び出し条件が不正です。

  • トランザクション種別が不正です。

05608

メモリが不足しました。

05615

その他のエラーが発生しました。

05623

DBキュー機能のライブラリがリンケージされていません。

05628

同じトランザクションブランチ内でこの関数が正常に終了したあと,再度呼び出されましたが,設定されたDBキューのタイプの属性が変更されたため,CBLEETRN('ROLLMARK')を呼び出しました。

05639

HiRDBの暗黙的ロールバックが発生したため,CBLEETRN('ROLLMARK')を呼び出しました。

05656

読み出し停止中です。

05657

他サービスでリード処理中です。

05658

ユーザキューアクセス機能を使用するDBキューではありません。

05659

未読み出しのメッセージはありません。

05697

同じトランザクションブランチ内でこの関数が正常に終了したあと,再度呼び出されましたが,RMで障害が発生したため,CBLEETRN('ROLLMARK')を呼び出しました。

05698

同じトランザクションブランチ内でこの関数が正常に終了したあと,再度呼び出されましたが,呼び出せる状態ではないため,CBLEETRN('ROLLMARK')を呼び出しました。

  • 通番の初期化中です。

注意事項

  1. DBキューサービス(ルートトランザクションブランチ)から呼び出された同一グローバルトランザクションのトランザクションブランチで,同一DBキューに対してメッセージの読み出しを行うと,デッドロックが発生する場合があります。

  2. 同一グローバルトランザクション内のトランザクションブランチ間で,同一DBキューに対してメッセージを書き込んだり読み出したりスキップしたりすると,デッドロックが発生する場合があります。

  3. 同一トランザクションで同一のDBキューに対して複数回CBLEEDBQ('MSGGET ')を呼び出すと,一回目以外の呼び出しでは,前回読み出したメッセージの次の通番のメッセージを読み出します。同じ通番のメッセージの再読み出しはしません。

  4. 【TP1/FSP限定】交替用メッセージ表書き込み機能使用時に,この関数内で行うメッセージ表へのアクセスで障害が発生すると,この関数はリターンしないでトランザクションがリトライロールバックする場合があります。