4.3 外部表を利用する場合の制限

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

<この節の構成>
(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を指定した場合,トランザクションの終了まで排他を保持します。排他オプションを指定した場合の外部サーバでの排他制御を表4-11に示します。また,WITH ROLLBACKおよびNO WAIT指定の排他オプションを指定した場合の外部サーバでの排他制御を表4-12に示します。

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

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

 

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

排他オプション
 
外部サーバでの排他制御
HiRDBXDM/RD E2ORACLEDB2
WITH ROLLBACKWITH ROLLBACKが適用されます。該当しません。※1※5該当しません。※2
NO WAITNO WAITが適用されます。該当しません。※3該当しません。※4該当しません。※4
注※1
外部サーバ上で排他制御しないため,排他の競合は発生しません。ただし,HiRDBが内部的にFOR UPDATE指定をした場合はNO WAITが適用されます。
注※2
DB2では,RESOURCE TIMEOUTの値が0の場合はWITH ROLLBACKと同じになります。0でない場合は,排他要求がタイムアウトした時点でトランザクションはロールバックされます。
注※3
XDM/RD E2では使用できないため,外部サーバ側でエラーになります。
注※4
排他資源の確保,タイムアウト,またはデッドロックの検知をするまで待ちます。タイムアウト,またはデッドロックの検知をした場合,トランザクションはロールバックされます。
注※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 ・T1の基表T1
        ↓                FT2の基表 T2
        SELECT C1 FROM T1 PDHUB1,T2 PDHUB1
  2. 外部表の基表の表識別子と同じ名称の相関名を指定すると,外部サーバによっては実行時にエラーとなることがあります。
      (例) SELECT C1 FROM FT1 T1 ・T1の基表T1
        ↓
        SELECT C1 FROM T1 T1
  3. 外部サーバに次の名称の表が存在すると,実行時にエラーとなることがあります。
    PDHUBxx:
    xxは1けた以上で1以上の整数を表す。
      (例) SELECT C1 FROM FT1 ・T1の基表PDHUB1
        ↓
        SELECT C1 FROM T1 PDHUB1,T2 PDHUB1

(15) 各国文字データ型への変換・代入に関する制限

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