Symfoware Parallel Server RDBユーザーズガイド 応用プログラム開発編
目次 索引 前ページ次ページ

第6章 クライアント・サーバ> 6.3 複数コネクション

6.3.5 複数コネクションでSQL文を実行する場合の注意事項

■カーソル操作での注

カーソルをオープンしたあとに、複数のコネクションにまたがって、同じカーソルの操作を行うことはできません。

ほかのコネクションで同じカーソルを操作するには、カーソルをクローズしたあとでなければなりません。このカーソル操作の例として、図:誤ったカーソルの操作の例に、誤った指定例を示します。また、図:正しいカーソルの操作の例に、正しいカーソル操作の例を示します。

[図:誤ったカーソルの操作の例]

[応用プログラム]

EXEC SQL DECLARE CUR1 CURSOR FOR SELECT  在庫数量   FROM   在庫表 ;  (1) 
                                                                          
 EXEC SQL CONNECT TO 'DB01' AS 'C1' ;                                (2) 
                                                                          
 EXEC SQL OPEN CUR1 ;                                                (3) 
                                                                          
 EXEC SQL CONNECT TO 'DB02' AS 'C2' ;                                (4) 
                                                                          
 EXEC SQL FETCH CUR1 INTO :STOCK  ;  →  エラー                      (5) 

(1) カーソル“CUR1”を宣言します。

(2) “DB01”に対して“C1”のコネクションを接続します。

(3) “DB01”に対して、カーソル“CUR1”をオープンします。

(4) “DB02”に対して“C2”のコネクションを接続します。

(5) “DB02”に対して、カーソル“CUR1”をFETCHすると、すでにサーバ“DB01”に対してカーソルがオープンしているため、エラーとなります。

[図:正しいカーソルの操作の例]

[応用プログラム]

EXEC SQL DECLARE CUR1 CURSOR FOR SELECT  在庫数量   FROM   在庫表 ;  (1) 
                                                                          
 EXEC SQL CONNECT TO 'DB01' AS 'C1' ;                                (2) 
 EXEC SQL OPEN CUR1 ;                                                (3) 
            〜                                                           
 EXEC SQL CLOSE CUR1 ;                                               (4) 
                                                                          
 EXEC SQL CONNECT TO 'DB02' AS 'C2' ;                                     
 EXEC SQL OPEN CUR1 ;                                                     
            〜                                                            
 EXEC SQL CLOSE CUR1 ;                                                    

(1) カーソル“CUR1”を宣言します。

(2) “DB01”に対して“C1”のコネクションを接続します。

(3) “DB01”に対して、カーソル“CUR1”をオープンします。

(4) カーソル“CUR1”をクローズします。そのあと、“DB02”にコネクションを接続して、カーソル“CUR1”をオープンします。

■更新操作での注

1つのトランザクションで、複数のコネクションに対してデータベースを更新するSQL文は実行できません。複数のコネクションのデータを更新する場合は、別々のトランザクションにする必要があります。

この更新操作の例として、図:誤った更新操作の例に、誤った指定例を示します。また、図:正しい更新操作の例に、正しい更新操作の例を示します。

[応用プログラム]

[図:誤った更新操作の例]

EXEC SQL CONNECT TO 'DB01' AS 'C1' ;                           (1)
                                                                  
EXEC SQL CONNECT TO 'DB02' AS 'C2' ;                           (2)
                                                                  
EXEC SQL UPDATE  在庫表   SET  在庫数量=300 WHERE  品番号=10;  (3)
                                                                  
EXEC SQL SET CONNECTION  'C1' ;                                (4)
                                                                  
EXEC SQL UPDATE  支店表  SET 社員数=100 WHERE  支店番号=80;    (5)
                                                 →  エラー       

(1) “DB01”に対して“C1”のコネクションを接続します。

(2) “DB02”に対して“C2”のコネクションを接続します。この場合のコネクションが現コネクションになります。

(3) “DB02”に対して更新操作を行います。

(4) “DB01”に現コネクションを変更します。

(5) “DB02”に対する更新操作のトランザクションが終了していないため、“DB01”に対する更新操作はエラーとなります。

[図:正しい更新操作の例]

[応用プログラム]

EXEC SQL CONNECT TO 'DB01' AS 'C1' ;                              
                                                                  
EXEC SQL CONNECT TO 'DB02' AS 'C2' ;                              
                                                                  
EXEC SQL UPDATE  在庫表   SET  在庫数量=300 WHERE  品番号=10;     
                                                                  
EXEC SQL COMMIT WORK ;                                         (1)
                                                                  
EXEC SQL SET CONNECTION  'C1' ;                                (2)
                                                                  
EXEC SQL UPDATE  支店表  SET 社員数=100 WHERE  支店番号=80;       
                                                                  
EXEC SQL COMMIT WORK ;                                            

(1) “DB02”に対しての更新操作のトランザクションを終了します。

(2) “DB01”に現コネクションを変更して、“DB01”に対して更新操作を行います。

■データベースの定義での注

1つのトランザクションで、複数のコネクションに対して、データベースの定義変更を行うことはできません。


目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2006