2016-04-25 13 views
3

リモートデータベースのパッケージにあるOracle PL/SQL関数(名前をGetRemoteBlobとします)は、 IN/OUT引数とBLOBを返します。このリモートデータベースには私はdblinkを持っています。私はリモートデータベース上の何かを変更することはできませんし、テーブルを直接使用することもできません。IN/OUT引数を持ち、DBからBLOBを返すOracle PL/SQL関数の呼び出し方法

この関数の可能性として、Javaコードを使用してBLOBをローカルデータベースに転送することが考えられます。このソリューションの欠点は、Javaがインストールされていないローカル・データベース(Oracle XEデータベースなど)ではこの機能を使用できないことです。

私の質問は次のとおりです: Java(または外部C)コードを使用せずに、関数GetRemoteBlobをdblink経由で呼び出すことは可能ですか?

Javaを使用せずに呼び出しを行うことはできませんが、IN/OUT引数を渡してリモート呼び出し後にOUT値を取得できるJava実装はどのようにする必要がありますか?

ご協力いただきありがとうございます。

+3

をnullsafeました。 BlobオブジェクトはDBリンクを介して戻すことはできません。 Blobを返す前に、Blobを別のものにキャストする必要があります。 https://gumpx.wordpress.com/2014/06/09/oracle-database-select-blob-via-db-link/には役に立つポインタや[this asktom article](https://asktom.oracle)がありますが.com/pls/apex/f?p = 100:11:0 :::: P11_QUESTION_ID:52297289480186) – xQbert

+0

このコメントはxQbertに感謝します。私はこの情報を知っているので、明示的に私はリモートデータベースのテーブルを直接使用することはできません。なぜなら、あなたが正しく理解すれば、Javaソリューションの他に、リモートデータベースからBLOBを取得する他の方法はありませんか? – Ramanagom

答えて

0

私はこの質問に答えることにしました。他の人がそれをチェックするかもしれないし、解決策もありますが、すでにコメントされているので直接dblinkからブロブを得ることはできません。

しかし、あなたはblobを読み取ることができるoracleで機能を作ることができますが、私は制限をテストしませんでしたが、私にとっては数キロバイトとメガバイトのblobで動作しました。

 
create or replace function GETBLOBVIADBLINK 
(dblnk in varchar2 
    ,tbl in varchar2 
    ,col in varchar2 
    ,rwid in urowid) 
return blob 
is 
    retval blob; 
    tmpraw raw(2000); 
    tmplen number; 
    tmpchk number; 
    chksize number; 
begin 
    --preset vars 
    chksize:=2000; 
    dbms_lob.createtemporary (retval,true); 
    execute immediate 'select [email protected]'||dblnk||' ('||col||') from '||tbl||'@'||dblnk||' where rowid=:rwid' into tmplen using rwid; 

    -- precalc 
    tmpchk:=floor(nvl(tmplen, 0)/chksize); 

    -- applicate frist chunks 
    for i in 0 .. tmpchk-1 
    loop 
    execute immediate 'select [email protected]'||dblnk||'('||col||','||chksize||','||((i*chksize)+1)||') from '||tbl||'@'||dblnk||' where rowid=:rwid' into tmpraw using rwid; 
    dbms_lob.append(retval,tmpraw); 
    end loop; 

    -- applicate last entry 
    if (tmplen-(tmpchk*chksize)) > 0 then 
    execute immediate 'select [email protected]'||dblnk||'('||col||','||(tmplen-(tmpchk*chksize))||','||((tmpchk*chksize)+1)||') from '||tbl||'@'||dblnk||' where rowid=:rwid' into tmpraw using rwid; 
    dbms_lob.append(retval,tmpraw); 
    end if; 
    return retval; 
end; 

クレジットがGumpxのこのlinkからですが、私はちょうどそれが、少なくとも直接ではなく...あなたがすることはできません

+0

このアプローチのおかげでCsBalazsHungaryに感謝します。私はあなたが投稿したリンクからの記事も見てきました。それらのソリューション(特にバージョン1)は確かに非常に有望です。 Unfortunatelly彼らは私の問題を解決しません - 私はリモートデータベースからテーブルを "直接"使用することはできません( "即時実行..."はまさにこれを行います)...私は現在Javaベースのソリューションを使用しています。 – Ramanagom

関連する問題