6.8.1 GET CONNECTION HANDLEの形式と規則
(1) 機能
X/Open XAインタフェース環境下で複数接続機能を使用する場合,UAPが使用する接続ハンドルを割り当てます。
(2) 形式
GET CONNECTION HANDLE :PDCNCTHDL型変数, :リターンコード受取変数, :環境変数グループ識別子変数
(3) オペランド
(a) :PDCNCTHDL型変数
PDCNCTHDL型として宣言した埋込み変数を指定します。
(b) :リターンコード受け取り変数
INT型として宣言した埋込み変数を指定します。
リターンコード受け取り変数に返される値を次に示します。
- C言語の場合
-
- 正常に取得された場合:
-
p_rdb_RC_NORM
- 何らかの障害が発生した場合:
-
各障害に対応したエラーコード
これらの値は,pdberrno.hに定義しています。
- COBOL言語の場合
-
- 正常に取得された場合:
-
P-RDB-RC-NORM
これらの値は,SQLCAMTH.CBLに定義しています。
(c) :環境変数グループ識別子変数
CHAR型(5バイト固定)として宣言した埋込み変数を指定します。
既定文字集合以外の文字集合は指定できません。
環境変数グループ識別子変数には,xa_open関数用文字列に指定した環境変数グループ識別子(ナル文字を含めて5バイト固定)を指定してください。
(4) 共通規則
-
使用する埋込み変数の宣言は,埋込み変数宣言部で行います。
-
接続ハンドルの取得に失敗した場合,その障害コードをリターンコード受け取り変数に設定します。
(5) 留意事項
-
ここで取得した接続ハンドルでSQLを発行する場合は,DECLARE CONNECTION HANDLE SETで使用する接続ハンドルの宣言をしてください。
-
COBOL言語の場合,環境変数グループ識別子変数に値を設定するときは,設定値の最後をナル文字にしてください。
-
OLTP下のX/Openに従ったUAPでは,GET CONNECTION HANDLEで取得した接続ハンドルはOLTPが解放します。このため,FREE CONNECTION HANDLEを発行して,接続ハンドルを解放しないでください。FREE CONNECTION HANDLEを発行して接続ハンドルを解放した場合,その後UAPが不正な動作をして,異常終了するおそれがあります。
(6) 使用例
PDCNCTHDL型変数がCnctHdl,リターンコード受け取り変数がGetchdlRtn,環境変数グループ識別子変数がGroupNameの接続ハンドルを割り当てます。
(C言語の場合)
EXEC SQL BEGIN DECLARE SECTION; PDCNCTHDL CnctHdl; long GetchdlRtn; char GroupId[5]; EXEC SQL END DECLARE SECTION; strcpy(GroupId,"HR01") ; EXEC SQL GET CONNECTION HANDLE :CnctHdl, :GetchdlRtn, :GroupId;
(COBOL言語の場合)
DATA DIVISION. WORKING-STORAGE SECTION. EXEC SQL BEGIN DECLARE SECTION END-EXEC. 01 CNCTHDL SQL TYPE IS PDCNCTHDL. 01 GETCHDLRTN PIC S9(9) COMP. 01 GROUPID PIC X(5). EXEC SQL END DECLARE SECTION END-EXEC. : PROCEDURE DIVISION. : MOVE 'HR01' & X'00' TO GROUPID. EXEC SQL GET CONNECTION HANDLE :CNCTHDL, :GETCHDLRTN, :GROUPID; END-EXEC.
(7) 注意事項
HiRDBサーバが複数接続機能をサポートしていない場合,一つのトランザクションから同一のHiRDBに対して,複数のコネクションハンドルを使ってSQLを実行できません。実行した場合,HiRDBサーバがPac2354のコードでアボートし,トランザクションがロールバックされます。よって,同一トランザクション内で複数のコネクションハンドルを使ったSQL文は同時に実行できません。
接続先がそれぞれ異なるHiRDBであれば,同一トランザクション内で複数のコネクションハンドルを使用できます。
誤りの例を次に示します。
《HiRDB1をRM01とRM02で登録している状態》 tx_begin() strcpy(grpnm, "RM01") GET CONNECTION HANDLE :hCnct,:rc,:grpnm; DECLARE CONNECTION HANDLE SET :hCnct; SQL実行 strcpy(grpnm, "RM02") GET CONNECTION HANDLE :hCnct,:rc,:grpnm; DECLARE CONNECTION HANDLE SET :hCnct; SQL実行 tx_commit()