4.3 外部表を利用する場合の制限
(1) トランザクションに関する制限
外部サーバに対するトランザクションは,すべて1相コミットとなります。
次に示す場合,更新後のコミット処理中に障害が発生すると,コミットされるサーバ(外部サーバ)とロールバックされるサーバ(外部サーバ)が混在するおそれがあります。
- 複数の外部サーバの資源を同時に更新した場合
- 自HiRDBの資源と外部サーバの資源を同時に更新した場合
このため,外部表を更新する場合は,一つのトランザクション内で一つの外部サーバだけ(自HiRDBも含めません)を更新することを推奨します。
(2) データ保証レベルおよび排他オプションに関する制限
HiRDBは,クライアント環境定義PDISLLVLで指定したデータ保証レベルを外部サーバへ引き継ぎます。排他オプションを指定してSQL文ごとに指定するデータ保証レベルも外部サーバに引き継がれます。ただし,排他オプションとしてWITH EXCLUSIVE LOCKを指定した場合,トランザクションの終了まで排他を保持します。排他オプションを指定した場合の外部サーバでの排他制御を表4-11に示します。また,WITH ROLLBACKおよびNO WAIT指定の排他オプションを指定した場合の外部サーバでの排他制御を表4-12に示します。
表4-11 排他オプションを指定した場合の外部サーバでの排他制御
排他オプション | 外部サーバでの排他制御 |
---|
HiRDB | XDM/RD E2 | ORACLE | DB2 |
---|
指定なし | HiRDBクライアントの設定に従います※1。 | データ保証レベルが0または1の場合は1となります。2の場合,SELECT文実行時にはFOR UPDATEが適用されます※2。 | HiRDBクライアントの設定に従います※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指定の排他オプションを指定した場合の外部サーバでの排他制御
排他オプション | 外部サーバでの排他制御 |
---|
HiRDB | XDM/RD E2 | ORACLE | DB2 |
---|
WITH ROLLBACK | WITH ROLLBACKが適用されます。 | 該当しません。※1※5 | 該当しません。※2 |
NO WAIT | NO 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) カーソルに関する制限
外部表,または外部表から作成したビュー表に対して,ホールダブルカーソルを使用することはできません。つまり,次の指定ができません。
- DECLARE CURSOR文のWITH HOLDおよびUNTIL DISCONNECT
- ALLOCATE CURSOR文のWITH HOLD
- 動的SELECT文のUNTIL DISCONNECT
- LOCK文のUNTIL DISCONNECT
(4) 外部サーバで実行できない更新系SQL
- 行の挿入,更新,または削除対象の表が外部表の場合,複数の外部サーバにわたるINSERT文,UPDATE文,DELETE文は指定できません。実行できるかどうかはHub最適化情報定義とSQL文の内容で決定されます。詳細は,マニュアル「HiRDB Version 8 システム定義」の「Hub最適化情報定義」の「注意事項」を参照してください。
- 外部サーバで実行しない構文は更新系SQLでは実行できません。
- 外部サーバがDB2の場合,その外部表を指定した更新系SQLは実行できません。
- 行を挿入する表が外部表で,かつ問合せ式本体に集合演算を含むINSERT文は実行できません。
- 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) 埋込み変数,および?パラメタに関する制限
- 値式中以外に次の文字型の埋込み変数,および?パラメタを指定した場合,埋込み変数,および?パラメタの実長がHub最適化情報定義のpd_hub_opt_data_lenオペランドの指定値を超えても,HiRDBで処理は実行されません。この場合,外部サーバで処理が実行され,エラーとなることがあります。Hub最適化情報定義については,マニュアル「HiRDB Version 8 システム定義」を参照してください。
- 固定長文字型
- 可変長文字型
- 固定長各国文字型
- 可変長各国文字型
- 固定長混在文字型
- 可変長混在文字型
- 文字データと数データ間のデータ変換を必要とする埋込み変数,および?パラメタを指定した場合,外部サーバによっては意図した結果が得られない,または実行時にエラーとなることがあります。
- 外部サーバで実行できる?パラメタの数が制限を超えた場合,外部サーバによっては意図した結果が得られない,または実行時にエラーとなることがあります。
(12) 16進文字列定数に関する制限
X'00'を含む場合,外部サーバに16進文字列定数を指定するため,外部サーバによっては実行時にエラーとなるときがあります。
(13) 外部サーバで実行する検索の検索項目数に関する制限
実行できる検索項目数がHiRDBより少ない外部サーバでは,実行時にエラーとなることがあります。
(14) 相関名に関する制限
- 相関名に次の名称が存在すると,実行時にエラーとなることがあります。
PDHUBxx:
xxは1けた以上で1以上の整数を表す。
(例) SELECT C1 FROM FT1 PDHUB1,FT2 ・T1の基表T1
↓ FT2の基表 T2
SELECT C1 FROM T1 PDHUB1,T2 PDHUB1
- 外部表の基表の表識別子と同じ名称の相関名を指定すると,外部サーバによっては実行時にエラーとなることがあります。
(例) SELECT C1 FROM FT1 T1 ・T1の基表T1
↓
SELECT C1 FROM T1 T1
- 外部サーバに次の名称の表が存在すると,実行時にエラーとなることがあります。
PDHUBxx:
xxは1けた以上で1以上の整数を表す。
(例) SELECT C1 FROM FT1 ・T1の基表PDHUB1
↓
SELECT C1 FROM T1 PDHUB1,T2 PDHUB1
(15) 各国文字データ型への変換・代入に関する制限
各国文字データ型への変換・代入を行う文字列定数が存在する場合,値中に1バイト文字を含むとSQL実行時に外部サーバでエラーとなることがあります。該当する場合を次に示します。
- データを挿入する列が各国文字データ型であるINSERT文で,挿入値に文字列定数を指定する。
- 更新対象になる列が各国文字データ型であるUPDATE文で,更新値として文字列定数を指定する。
- 探索条件に,各国文字データの比較対象として文字列定数を指定する。