2008-09-01 105 views
11

如果创建Oracle数据库链接,则无法直接访问目标表中的LOB列。在Oracle分布式数据库中处理LOB的最佳方法

例如,您创建了一个DBLINK:

create database link TEST_LINK 
    connect to TARGETUSER IDENTIFIED BY password using 'DATABASESID'; 

在这之后,你可以做的东西,如:

select column_a, column_b 
from [email protected]_LINK 

除非该列是LOB,那么你得到的错误:

ORA-22992: cannot use LOB locators selected from remote tables 

这是a documented restriction

在同一个页面提示你获取值到本地表,但是这是...有点凌乱:

CREATE TABLE tmp_hello 
AS SELECT column_a 
from [email protected]_LINK 

任何其他的想法?

回答

4

是的,它很混乱,我想不出一种方法来避免它。
您可以通过将临时表创建置于存储过程中(并使用“立即执行”来创建表)来隐藏客户端的一些混乱状况
您需要注意的一件事是留在临时表上(如果在你有时间清理它之前,某个事情会中途失败) - 你可以安排一个oracle作业来定期运行并删除剩下的表。

0

您是否有特定的情景? 例如,如果LOB保存文件,并且您位于公司Intranet上,则可以编写存储过程以将文件解压缩到网络上已知的目录并从那里访问它们。

0

在这种特定情况下,两个系统可以通信的唯一方式是使用dblink。

此外,表解决方案并不那么糟糕,只需要“缓存”dblink一侧的数据就很麻烦。

1

您可以使用materalized视图来处理所有“缓存”管理。 It's并不完美,但工作在大多数情况下:)

8

通过如下查询,其中column_b是BLOB最好的解决办法:

SELECT (select column_b from [email protected]_LINK) AS column_b FROM DUAL 
+3

这就像一个魅力!互联网上的最佳答案! – gabrjan 2014-04-03 11:40:50

0

对于查询数据,user2015502的解决方案是最聪明。如果要插入或更新LOB的AT远程数据库(插入xxx @ yyy ...),您可以轻松使用动态SQL。见my solution here:

相关问题