10.1 SQLおよびPL/SQLでのリモートLOBの操作

この項では、リモートLOBでサポートされるSQL関数およびPL/SQL関数について説明します。

SQL関数

ネストした関数によって返される最終値がLOB型でないかぎり、ローカルのLOBとBFILEでサポートされるすべてのSQL組込み関数およびユーザー定義型関数は、リモートのLOBとBFILEでもサポートされます。これには、リモートの永続および一時LOBとBFILE用のファンクションも含まれます。

次の項のほとんどの例では、print_media表を使用します。表の構造は次のとおりです。

print_media表

リモート・サイトで実行されるSQL組込み関数は、SELECTINSERTUPDATEおよび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を戻すファンクションには、REPLACESUBSTRCONCAT、||、TRIMLTRIMRTRIMLOWERUPPERNLS_LOWERNLS_UPPERLPAD、およびRPADがあります。
    • 元のLOBロケータを戻すファンクションには、NVLDECODEおよび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;
    
  • 1つ以上のLOB引数を受け入れるファンクション。

    これらには、INSTRLIKEREPLACECONCAT、||、SUBSTRTRIMLTRIMRTRIMLPADおよび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を返すことができるのは、オラクル社が提供するビューのみです。