我有两个数据库,一个是用于数据加载和另一个用于数据监视器,我需要显示一个二进制大对象的内容数据从数据加载服务器使用分贝链接,我试过,但我不能做,任何选项下载二进制大对象的内容从一个服务器到另一个服务器与分贝链接.Oracle中的常规select语句
2hh7jdfx1#
只要是在表之间移动,而不仅仅是选择,就可以跨数据库链接移动LOB。这避免了使用临时LOB定位器,而这正是限制所在。因此,您可以通过以下几种方式在数据库链接上选择LOB(CLOB或BLOB)内容:1.使用CTAS(CREATE 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数据类型中的相同数据快得多。举例来说:
CREATE TABLE AS SELECT ...
INSERT SELECT
dbms_lob
dbms_lob.getlength@dblink(...)
dbms_lob.substr@dblink(...)
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限制的情况下,它可能很有用。
ROWID
varchar2/raw
1条答案
按热度按时间2hh7jdfx1#
只要是在表之间移动,而不仅仅是选择,就可以跨数据库链接移动LOB。这避免了使用临时LOB定位器,而这正是限制所在。
因此,您可以通过以下几种方式在数据库链接上选择LOB(CLOB或BLOB)内容:
1.使用CTAS(
CREATE 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数据类型中的相同数据快得多。举例来说:显然,这不能帮助过大的值,但一种加快链路上大量LOB传输的技术是首先将没有实际LOB但具有
ROWID
s的数据拉入临时表,然后以这种方式拉入小LOB值,更新临时表并清除这些行的ROWID,然后合并所有剩余的ROWID
s拉入完整的LOB,只有超大号的这种技术的复杂性可能不值得普遍使用,但在体积特别大且大多数值小于varchar2/raw
限制的情况下,它可能很有用。