私はこの質問に答えることにしました。他の人がそれをチェックするかもしれないし、解決策もありますが、すでにコメントされているので直接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からですが、私はちょうどそれが、少なくとも直接ではなく...あなたがすることはできません
を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
このコメントはxQbertに感謝します。私はこの情報を知っているので、明示的に私はリモートデータベースのテーブルを直接使用することはできません。なぜなら、あなたが正しく理解すれば、Javaソリューションの他に、リモートデータベースからBLOBを取得する他の方法はありませんか? – Ramanagom