10.1 SQLおよびPL/SQLでのリモートLOBの操作
この項では、リモートLOBでサポートされるSQL関数およびPL/SQL関数について説明します。
SQL関数
ネストした関数によって返される最終値がLOB型でないかぎり、ローカルのLOBとBFILEでサポートされるすべてのSQL組込み関数およびユーザー定義型関数は、リモートのLOBとBFILEでもサポートされます。これには、リモートの永続および一時LOBとBFILE用のファンクションも含まれます。
次の項のほとんどの例では、print_media
表を使用します。表の構造は次のとおりです。

リモート・サイトで実行されるSQL組込み関数は、SELECT
、INSERT
、UPDATE
およびDELETE
と同様に、SQL文内に含めることができます。たとえば:
SELECT LENGTH(ad_sourcetext) FROM print_media@remote_site -- CLOB
SELECT LENGTH(ad_fltextn) FROM print_media@remote_site; -- NCLOB
SELECT LENGTH(ad_composite) FROM print_media@remote_site; -- BLOB
SELECT product_id from print_media@remote_site WHERE LENGTH(ad_sourcetext) > 3;
UPDATE print_media@remote_site SET product_id = 2 WHERE LENGTH(ad_sourcetext) > 3;
SELECT TO_CHAR(foo@dbs2(...)) FROM dual@dbs2;
-- where foo@dbs2 returns a temporary LOB
PL/SQL関数
ネストしたファンクションによって戻される最終値がLOBでないかぎり、リモート・サイトで実行され、リモートLOBとBFILEを操作する、組込みおよびユーザー定義型PL/SQLファンクションを使用できます。
SELECT product_id FROM print_media@dbs2 WHERE foo@dbs2(ad_sourcetext, 'aa') > 0;
-- foo is a user-define function returning a NUMBER
DELETE FROM print_media@dbs2 WHERE DBMS_LOB.GETLENGTH@dbs2(ad_graphic) = 0;
リモートのユーザー定義型関数に関する制限事項
SQL関数およびPL/SQL関数は、次のカテゴリの包括的でないリストに分類されます。
- LOBでサポートされていないSQLファンクション
LOBでサポートされていない
DECODE
関数などのSQL関数は、リモートLOBでもサポートされません。 - 1つのLOB引数のみを受け入れ(他のすべての引数はLOB以外のデータ型)、LOBを返さない関数
LENGTH関数などの関数がサポートされています。たとえば:
SELECT LENGTH(ad_composite) FROM print_media@remote_site; SELECT LENGTH(ad_header.logo) FROM print_media@remote_site; -- LOB in object SELECT product_id from print_media@remote_site WHERE LENGTH(ad_sourcetext) > 3;
-
LOBを戻すファンクション
これらのファンクションは、元のLOBを戻すか、または一時LOBを生成する場合があります。これらのファンクションは、ローカル・サイトに戻される結果がLOBでないかぎり、リモート・サイトで実行できます。
- 一時LOBを戻すファンクションには、
REPLACE
、SUBSTR
、CONCAT
、||、TRIM
、LTRIM
、RTRIM
、LOWER
、UPPER
、NLS_LOWER
、NLS_UPPER
、LPAD
、およびRPAD
があります。 - 元のLOBロケータを戻すファンクションには、
NVL
、DECODE
およびCASE
があります。
たとえば、次の文がサポートされています。
SELECT TO_CHAR(CONCAT(ad_sourcetext, ad_sourcetext)) FROM print_media@remote_site; SELECT TO_CHAR(SUBSTR(ad_fltextnfs, 1, 3)) FROM print_media@remote_site;
しかし、次の文はサポートされていません。
SELECT CONCAT(ad_sourcetext, ad_sourcetext) FROM print_media@remote_site; SELECT SUBSTR(ad_sourcetext, 1, 3) FROM print_media@remote_site;
- 一時LOBを戻すファンクションには、
-
1つ以上のLOB引数を受け入れるファンクション。
これらには、
INSTR
、LIKE
、REPLACE
、CONCAT
、||、SUBSTR
、TRIM
、LTRIM
、RTRIM
、LPAD
およびRPAD
があります。これらのファンクションは、すべてCLOB
およびNCLOB
のみに該当します。これらの関数は、すべてのLOB引数が同じ
dblink
にある場合にのみサポートされます。たとえば、次がサポートされています。SELECT TO_CHAR(CONCAT(ad_sourcetext, ad_sourcetext)) FROM print_media@remote_site; -- CLOB SELECT TO_CHAR(CONCAT(ad_fltextn, ad_fltextn)) FROM print_media@remote_site; -- NCLOB
ただし次はサポート対象外
SELECT TO_CHAR(CONCAT(a.ad_sourcetext, b.ad_sourcetext)) FROM print_media@db1 a, print_media@db2 b WHERE a.product_id = b.product_id;
- LOBを操作するPL/SQL関数:
1つの
dblink
内のファンクションは、他のdblink内のLOBデータを操作できません。たとえば、次の文はサポートされていません。SELECT a.product_id FROM print_media@dbs1 a, print_media@dbs2 b WHERE CONTAINS@dbs1(b.ad_sourcetext, 'aa') >0;
- 問合せブロック内の複数のLOB:
1つの問合せブロックに、異なる
dblinks
の表および関数を含めることはできません。たとえば、次の文はサポート対象外SELECT a.product_id FROM print_media@dbs2 a, print_media@dbs3 b WHERE CONTAINS@dbs2(a.ad_sourcetext, 'aa') > 0 AND foo@dbs3(b.ad_sourcetext) > 0; -- foo is a user-defined function in dbs3
- LOBの演算子および列は、それらが
SELECT
リスト、および結合問合せのwhere
句にある場合にサポートされます。 - オラクル社が提供するPL/SQL関数およびプロシージャでは、LOBロケータを返すことができます。
- 一時LOBを返すSQL演算子は、リモートLOBのみでサポートされています。
- LOBを返すことができるのは、オラクル社が提供するビューのみです。
親トピック: 分散LOB