ページの先頭行へ戻る
Symfoware Server V10.0.0/V10.0.1 アプリケーション開発ガイド(埋込みSQL編)

2.2.2 複数コネクション

アプリケーションの1つのセションで、複数のCONNECT文を実行することによって、複数のコネクションを接続することができます。この場合、SQL文の実行対象となるコネクションを決めておく必要があります。SQL文の実行対象となるコネクションを現コネクションと呼びます。ここでは、現コネクションの操作について、以下の順に説明します。

2.2.2.1 現コネクションとSQL文の実行

複数のCONNECT文を実行した場合、最後のCONNECT文で接続したコネクションが、現コネクションとなります。

複数コネクションのプログラミング概要を以下に示します。

[アプリケーション]

:
EXEC SQL  CONNECT TO  'DB01' AS  'C1' ;                              … (1)
                        :
EXEC SQL  CONNECT TO  'DB02' AS  'C2' ;                             … (2)

                        :
EXEC SQL  SELECT  在庫数量,倉庫番号 INTO  :H1, :H2  FROM S.T        … (3)
          WHERE 倉庫番号=2 ;
                        :
                        :
EXEC SQL  CONNECT TO  'SV3' AS  'C3'  USER  'U3/PASS3';             … (4)
                        :
EXEC SQL  CONNECT TO  'SV4' AS  'C4'  USER  'U4/PASS4';             … (5)

                        :
EXEC SQL  SELECT  在庫数量,倉庫番号 INTO  :H1, :H2  FROM S1.T1      … (6)
          WHERE 倉庫番号=2  ;
                        :

(1)~(3)は、ローカルアクセスの場合です。(4)~(6)は、リモートアクセスの場合です。

(1) 1回目のCONNECT文により、“DB01”に対して“C1”のコネクションを接続します。

(2) 2回目のCONNECT文により、“DB02”に対して“C2”のコネクションを接続します。

(3) 現コネクションの“DB02”に対して単一行SELECT文を実行します。

(4) 3回目のCONNECT文により、サーバ“SV3”に対して“C3”のコネクションを接続します。

(5) 4回目のCONNECT文により、サーバ“SV4”に対して“C4”のコネクションを接続します。

(6) 現コネクションのサーバ“SV4”に対して単一行SELECT文を実行します。

2.2.2.2 現コネクションの変更

複数のコネクションを接続した場合、SET CONNECTION文で現コネクションを変更することができます。SET CONNECTION文を利用することにより、変更した現コネクションのサーバとデータ操作を行うことができます。

現コネクションを変更する際に、トランザクションを終了する必要はありません。しかし、同一のトランザクションで、複数のコネクションに対してデータベースを更新するSQL文を実行することはできません。その際にはトランザクションを一度終了してください。

現コネクションを変更するプログラミングの概要を以下に示します。

[アプリケーション]

:
EXEC SQL CONNECT TO  'DB01' AS  'C1' ;                                … (1)
                        :
EXEC SQL SELECT  在庫数量,倉庫番号  INTO  :H1, :H2  FROM  在庫表      … (2)
                                                   WHERE 在庫数量=300 ;
                        :
EXEC SQL COMMIT WORK ;                                               … (3)
                        :
EXEC SQL CONNECT TO  'DB02' AS  'C2' ;                               … (4)
                        :
EXEC SQL INSERT INTO 伝票( 在庫カラム, 倉庫カラム) VALUES(:H1,:H2) ; … (5)

EXEC SQL COMMIT WORK ;                                               … (6)
                        :
EXEC SQL SET CONNECTION  'C1' ;                                      … (7)
                        :
EXEC SQL SELECT  出荷量   INTO  :H3  FROM  在庫表2  WHERE XX=100 ;  … (8)

EXEC SQL COMMIT WORK ;                                               … (9)
                        :
                        :
EXEC SQL CONNECT TO  'SV3' AS  'C3'  USER  'U3/PASS3' ;              … (10)
                        :
EXEC SQL SELECT  在庫数量,倉庫番号  INTO  :H1, :H2  FROM  在庫表1  … (11)
                                                    WHERE 倉庫番号=2 ;
                        :
EXEC SQL COMMIT WORK ;                                              … (12)
                        :
EXEC SQL CONNECT TO  'SV4' AS  'C4'  USER  'U4/PASS4' ;             … (13)
                        :
EXEC SQL INSERT INTO 伝票1(在庫カラム, 倉庫カラム) VALUES(:H1,:H2) ; … (14)

EXEC SQL COMMIT WORK ;                                              … (15)
                        :
EXEC SQL SET CONNECTION  'C3' ;                                     … (16)
                        :
EXEC SQL SELECT  出荷量   INTO  :H3  FROM  在庫表3  WHERE XX=100 ; … (17)
                        :

(1)~(9)は、ローカルアクセスの場合です。(10)~(17)は、リモートアクセスの場合です。

(1) 1回目のCONNECT文により、“DB01”に対して“C1”のコネクションを接続します。

(2) “DB01”の在庫表から単一行SELECT文で在庫数量と倉庫番号を取り出します。

(3) (2)の操作に対して、トランザクションを終了します。

(4) 2回目のCONNECT文により、“DB02”に対して“C2”のコネクションを接続します。

(5) “DB02”の伝票の在庫カラムと倉庫カラムに、“DB01”から取り出した在庫数量と倉庫番号を追加します。

(6) (5)の操作に対して、トランザクションを終了します。

(7) SET CONNECTION文により、現コネクションを“C1”に変更します。

(8) “DB01”の在庫表2から単一行SELECT文で出荷量を取り出します。

(9) (8)の操作に対して、トランザクションを終了します。

(10) 3回目のCONNECT文により、サーバ“SV3”に対して“C3”のコネクションを接続します。

(11) サーバ“SV3”の在庫表1から、単一行SELECT文で在庫数量と倉庫番号を取り出します。

(12) (11)の操作に対して、トランザクションを終了します。

(13) 4回目のCONNECT文により、サーバ“SV4”に対して“C4”のコネクションを接続します。

(14) サーバ“SV4”の伝票1の在庫カラムと倉庫カラムに、サーバ“SV3”から取り出した在庫数量と倉庫番号を追加します。

(15) (14)の操作に対して、トランザクションを終了します。

(16) SET CONNECTION文により、現コネクションを“C3”に変更します。

(17) サーバ“SV3”の在庫表3から単一行SELECT文で出荷量を取り出します。


トランザクションを終了させずに現コネクションを変更するプログラミングの概要を以下に示します。

[アプリケーション]

EXEC SQL DECLARE CUR1 CURSOR FOR SELECT  在庫数量,倉庫番号   FROM   在庫表 ;

EXEC SQL CONNECT TO  'DB01' AS  'C1' ;
                         :
EXEC SQL OPEN CUR1 ;

EXEC SQL FETCH CUR1 INTO :H1,:H2  ;
                         :
EXEC SQL CONNECT TO  'DB02' AS  'C2' ;
                         :
EXEC SQL INSERT INTO 伝票(在庫カラム, 倉庫カラム) VALUES(:H1,:H2) ;
                         :
EXEC SQL SET CONNECTION  'C1' ;
                         :
EXEC SQL FETCH CUR1 INTO :H1,:H2  ;
                         :
EXEC SQL SET CONNECTION  'C2' ;
                         :
EXEC SQL INSERT INTO 伝票(在庫カラム, 倉庫カラム) VALUES(:H1,:H2) ;
                         :