oracle 如何使用dB link从一个服务器到另一个服务器选择blob数据

xwmevbvl  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(125)

我有两个数据库,一个是用于数据加载和另一个用于数据监视器,我需要显示一个二进制大对象的内容数据从数据加载服务器使用分贝链接,我试过,但我不能做,任何选项下载二进制大对象的内容从一个服务器到另一个服务器与分贝链接.
Oracle中的常规select语句

2hh7jdfx

2hh7jdfx1#

只要是在表之间移动,而不仅仅是选择,就可以跨数据库链接移动LOB。这避免了使用临时LOB定位器,而这正是限制所在。
因此,您可以通过以下几种方式在数据库链接上选择LOB(CLOB或BLOB)内容:
1.使用CTASCREATE TABLE AS SELECT ...)拉取数据并写入本地。在内部数据移动方面,Oracle能够使用远程LOB定位器,尽管通常会出现相反的错误消息。
1.数据保存到本地表中(INSERT SELECT)。
1.对已经包含所有非LOB列的现有本地表使用MERGE或UPDATE,以使用远程LOB更新LOB列。
1.如果你的CLOB < 4KB或BLOB < 2KB,(使用远程dbms_lob调用来测试和子串dbms_lob.getlength@dblink(...)dbms_lob.substr@dblink(...)),你可以将其转换为varchar2(4000)或raw(2000),这将在任何普通SQL中拉取非常快,比LOB数据类型中的相同数据快得多。举例来说:

SELECT CAST(dbms_lob.substr@dblink(myblobcol,2000,1) AS raw(2000))
  FROM remotetable@dblink
 WHERE dbms_lob.getlength@dblink(myblobcol) <= 2000

显然,这不能帮助过大的值,但一种加快链路上大量LOB传输的技术是首先将没有实际LOB但具有ROWID s的数据拉入临时表,然后以这种方式拉入小LOB值,更新临时表并清除这些行的ROWID,然后合并所有剩余的ROWID s拉入完整的LOB,只有超大号的这种技术的复杂性可能不值得普遍使用,但在体积特别大且大多数值小于varchar2/raw限制的情况下,它可能很有用。

  • (注意:我希望这是更好的记录,但我们留下了一点猜测,为什么SELECT失败,但DML工作。我假设基于错误消息,在SELECT语句中,Oracle可能试图隐式地创建本地临时LOB,并且必须将其定位器发送到远程以进行复制,这是不允许的,可能是由于拥有私有进程之外的临时段的可寻址性限制。这当然只是猜测。无论内部发生了什么,问题都只存在于SELECT语句中。DML与公共可访问的永久LOB定位器一起使用,因此似乎没有问题)*

相关问题