付録D 外部表を利用する場合の制限事項

外部表を利用する場合の制限事項について説明します。

<この節の構成>
(1) トランザクション
(2) データ保証レベルと排他オプション
(3) カーソル
(4) 外部サーバで実行できない更新系SQL
(5) 行単位の操作
(6) LOCK文
(7) 外部サーバでの演算処理
(8) 副問合せ
(9) 名前付きの導出表(外部サーバがHiRDBの場合)
(10) 名前付きの導出表(外部サーバがXDM/RD E2の場合)
(11) 埋込み変数,及び?パラメタ
(12) 16進文字列定数
(13) 外部サーバで実行する検索の検索項目数
(14) 相関名
(15) 各国文字データ型への変換・代入

(1) トランザクション

外部サーバに対するトランザクションは,すべて1相コミットとなります。

次に示す場合,更新後のコミット処理中に障害が発生すると,コミットされるサーバ(外部サーバ)とロールバックされるサーバ(外部サーバ)が混在するおそれがあります。

このため,外部表を更新する場合は,一つのトランザクション内で一つの外部サーバだけ(自HiRDBも含めません)を更新することを推奨します。

(2) データ保証レベルと排他オプション

HiRDBは,クライアント環境定義PDISLLVLで指定したデータ保証レベルを外部サーバへ引き継ぎます。排他オプションを指定してSQL文ごとに指定するデータ保証レベルも外部サーバに引き継がれます。ただし,排他オプションとしてWITH EXCLUSIVE LOCKを指定した場合,トランザクションの終了まで排他を保持します。排他オプションを指定した場合の外部サーバでの排他制御を次の表に示します。また,WITH ROLLBACK及びNO WAIT指定の排他オプションを指定した場合の外部サーバでの排他制御を表D-2に示します。

表D-1 排他オプションを指定した場合の外部サーバでの排他制御

排他オプション
 
外部サーバでの排他制御
HiRDBXDM/RD E2OracleDB2
指定なしHiRDBクライアントの設定に従います。※1データ保証レベルが0又は1の場合は1となります。2の場合,SELECT文実行時にはFOR UPDATEが適用されます。※3HiRDBクライアントの設定に従います。※2
WITH SHARE LOCKWITH SHARE LOCKが適用されます。SELECT文実行時にFOR UPDATEが適用されます。※3データ保証レベルが0又は1の場合は2に変更されます。
WITH EXCLUSIVE LOCKWITH EXCLUSIVE LOCKが適用されます。SELECT文実行時にFOR UPDATEが適用されます。※5データ保証レベルが0又は1の場合は2に変更されます。※4
WITHOUT LOCK〔WAIT〕WITHOUT LOCKが適用されます。データ保証レベル1となります(排他オプションは適用されません)。データ保証レベルが0の場合は1に変更されます。
WITHOUT LOCK NOWAITWITHOUT LOCK NOWAITが適用されます。データ保証レベル1となります(排他オプションは適用されません)。データ保証レベルが0以外の場合は0に変更されます。
注※1
クライアント環境定義PDISLLVLに指定した値に対応する排他オプションが,SQL文に適用されます。0の場合はWITHOUT LOCK NOWAIT,1の場合はWITHOUT LOCK WAIT,2の場合はWITH SHARE LOCKがそれぞれ適用されます。省略している場合,SQL文にはWITH SHARE LOCKが適用されます。
注※2
クライアント環境定義PDISLLVLに指定した値を引き継ぎます。省略している場合は2が仮定されます。
注※3
外部サーバ情報定義のpd_hb_get_lockオペランドにYを指定した場合,SELECT文実行時にFOR UPDATE指定が仮定されます。外部サーバ情報定義については,マニュアル「HiRDB Version 8 システム定義」を参照してください。
注※4
DB2には,該当する機能がありません。WITH EXCLUSIVE LOCKを指定した場合でも,共用モードの排他制御となります。
注※5
ORACLEでは,FOR UPDATEが適用されると,DISTINCT,GROUP BY,集合演算,集約関数などの場合,エラーとなることがあります。DISTINCT,GROUP BY,集合演算,集約関数などを使用する場合,HiRDBでWITH EXCLUSIVE LOCKを指定しないようにできないか検討してください。

 

表D-2 WITH ROLLBACK及びNO WAIT指定の排他オプションを指定した場合の外部サーバでの排他制御

排他オプション
 
外部サーバでの排他制御
HiRDBXDM/RD E2OracleDB2
WITH ROLLBACKWITH ROLLBACKが適用されます。該当しません。※1※5該当しません。※2
NO WAITNO WAITが適用されます。該当しません。※4該当しません。※1該当しません。※3
注※1
外部サーバ上で排他制御しないため,排他の競合は発生しません。ただし,HiRDBが内部的にFOR UPDATE指定をした場合はNO WAITが適用されます。
注※2
DB2では,RESOURCE TIMEOUTの値が0の場合はWITH ROLLBACKと同じになります。0でない場合は,排他要求がタイムアウトした時点でトランザクションはロールバックされます。
注※3
排他資源の確保,タイムアウト,又はデッドロックの検知をするまで待ちます。タイムアウト,又はデッドロックの検知をした場合,トランザクションはロールバックされます。
注※4
XDM/RD E2では使用できないため,外部サーバ側でエラーとなります。
注※5
更新系SQL中にWITH ROLLBACKは指定できません。

(3) カーソル

外部表,又は外部表を基表とするビュー表に対して,ホールダブルカーソルは使用できません。つまり,次の指定ができません。

(4) 外部サーバで実行できない更新系SQL

  1. 行の挿入,更新,又は削除対象の表が外部表の場合,複数の外部サーバにわたるINSERT文,UPDATE文,DELETE文は指定できません。実行できるかどうかはHub最適化情報定義とSQL文の内容で決定されます。詳細は,マニュアル「HiRDB Version 8 システム定義」の「Hub最適化情報定義」の「注意事項」を参照してください。
  2. 外部サーバで実行しない構文は更新系SQLでは実行できません。
  3. 外部サーバがDB2の場合,その外部表を指定した更新系SQLは実行できません。
  4. 行を挿入する表が外部表で,かつ問合せ式本体に集合演算を含むINSERT文は実行できません。
  5. WITH ROLLBACKをサポートしていない外部サーバの場合,その外部表に対する更新系SQLにWITH ROLLBACKを指定できません。

(5) 行単位の操作

外部表に対して,行単位の操作はできません。

(6) LOCK文

LOCK文で指定した外部表の排他に失敗した場合,LOCK文を実行したトランザクションはロールバックされます。

(7) 外部サーバでの演算処理

外部サーバから256バイト以上のデータは取得できません。

外部サーバ上の256バイト以上の列を,外部表の列(長さnバイト:n≦255)として定義した場合,先頭のnバイト分のデータを取得します。このとき,標識変数に外部サーバ上での定義長が設定されます。

(8) 副問合せ

外部表をアクセスするSQLには,副問合せは指定できません。また,副問合せを含むビュー表は,外部表と混在して指定できません。

(9) 名前付きの導出表(外部サーバがHiRDBの場合)

内部導出表となる条件を満たす,外部サーバ上のビュー表を外部表として定義した場合,内部導出表となる条件を満たす問合せ中でその外部表を指定したときは,外部サーバでエラーとなることがあります。

(10) 名前付きの導出表(外部サーバがXDM/RD E2の場合)

外部表から導出する名前付き導出表の列名に14文字以上の全角文字を使用していて,かつ名前付き導出表が内部導出表となる場合,外部サーバでエラーとなります。

(11) 埋込み変数,及び?パラメタ

  1. 値式中以外に次の文字型の埋込み変数,及び?パラメタを指定した場合,埋込み変数,及び?パラメタの実長がHub最適化情報定義のpd_hub_opt_data_lenオペランドの指定値を超えても,HiRDBで処理は実行されません。この場合,外部サーバで処理が実行され,エラーとなることがあります。Hub最適化情報定義については,マニュアル「HiRDB Version 8 システム定義」を参照してください。
    • 固定長文字型
    • 可変長文字型
    • 固定長各国文字型
    • 可変長各国文字型
    • 固定長混在文字型
    • 可変長混在文字型
  2. 文字データと数データ間のデータ変換を必要とする埋込み変数,及び?パラメタを指定した場合,外部サーバによっては意図した結果が得られない,又は実行時にエラーとなることがあります。
  3. 外部サーバで実行できる?パラメタの数が制限を超えた場合,外部サーバによっては意図した結果が得られない,又は実行時にエラーとなることがあります。

(12) 16進文字列定数

X'00'を含む場合,外部サーバに16進文字列定数を指定するため,外部サーバによっては実行時にエラーとなることがあります。

(13) 外部サーバで実行する検索の検索項目数

実行できる検索項目数がHiRDBより少ない外部サーバでは,実行時にエラーとなることがあります。

(14) 相関名

  1. 相関名に次の名称が存在すると,実行時にエラーとなることがあります。
    PDHUBxx:
    xxは1けた以上で1以上の整数を表す
     (例)SELECT C1 FROM FT1 PDHUB1,FT2
         ↓
        SELECT C1 FROM T1 PDHUB1,T2 PDHUB1
       (凡例) T1:FT1の基表
            T2:FT2の基表
  2. 外部表の基表の表識別子と同じ名称の相関名を指定すると,外部サーバによっては実行時にエラーとなることがあります。
     (例)SELECT C1 FROM FT1 T1
         ↓
        SELECT C1 FROM T1 T1
       (凡例) T1:FT1の基表
  3. 外部サーバに次の名称の表が存在すると,実行時にエラーとなることがあります。
    PDHUBxx:
    xxは1けた以上で1以上の整数を表す
     (例)SELECT C1 FROM FT1
         ↓
        SELECT C1 FROM T1 PDHUB1,T2 PDHUB1
       (凡例) PDHUB1:FT1の基表

(15) 各国文字データ型への変換・代入

各国文字データ型への変換・代入を行う文字列定数が存在する場合,値中に1バイト文字を含むとSQL実行時に外部サーバでエラーとなることがあります。該当する場合を次に示します。