gpt4 book ai didi

java - 如何调用具有 IN/OUT 参数并通过 DB Link 返回 BLOB 的 Oracle PL/SQL 函数

转载 作者:搜寻专家 更新时间:2023-10-30 19:52:53 30 4
gpt4 key购买 nike

我有一个 Oracle PL/SQL 函数(将其命名为 GetRemoteBlob),它驻留在远程数据库的一个包中,接受一个 IN/OUT 参数并返回 BLOB。对于这个远程数据库,我有一个 dblink。我不能修改远程数据库上的任何内容,也不能直接使用这些表。

此函数的一种可能用法是使用 Java 代码将 BLOB 传输到本地数据库。该解决方案的缺点是,未安装 Java 的本地数据库(如 Oracle XE 数据库)无法使用此功能。

我的问题是这样的:是否可以通过 dblink 调用该函数 GetRemoteBlob,而不使用 Java(或外部 C)代码?

如果无法在没有 Java 的情况下进行调用,那么 Java 实现应该如何允许我传递 IN/OUT 参数并在远程调用后获取 OUT 值?

预先感谢您的关注和帮助。

最佳答案

我决定回答这个问题,因为其他人可能会检查出来,是的,有一种解决方案,但正如已经评论的那样,您不能直接从 dblink 获取 blob。

但是你可以在 oracle 中创建一个能够读取 blob 的函数,我从未测试过这些限制,但对我来说它适用于几千字节和几兆字节的 blob,而且速度相当快。

create or replace function GETBLOBVIADBLINK( dblnk in varchar2  ,tbl  in varchar2  ,col  in varchar2  ,rwid in urowid)return blobis  retval blob;  tmpraw raw(2000);    tmplen number;  tmpchk number;  chksize number;begin  --preset vars  chksize:=2000;  dbms_lob.createtemporary (retval,true);  execute immediate 'select dbms_lob.getlength@'||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 dbms_lob.substr@'||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 dbms_lob.substr@'||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

关于java - 如何调用具有 IN/OUT 参数并通过 DB Link 返回 BLOB 的 Oracle PL/SQL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36840009/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com