在Oracle分布式数据库中处理LOB的最佳方法

14

如果您创建了Oracle dblink,则无法直接访问目标表中的LOB列。

例如,您创建了一个具有以下内容的dblink:

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

之后,您可以执行以下操作:

select column_a, column_b 
from data_user.sample_table@TEST_LINK

如果列是LOB类型,则会出现错误:

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

这是一个有文档记录的限制

同一页建议将值获取到本地表中,但那有点...凌乱:

CREATE TABLE tmp_hello 
AS SELECT column_a 
from data_user.sample_table@TEST_LINK

还有其他想法吗?

6个回答

17

使用以下查询可以得到最佳解决方案,其中 column_b 是一个 BLOB 类型的列:

SELECT (select column_b from sample_table@TEST_LINK) AS column_b FROM DUAL

1
@user2015502,你尝试在Hibernate公式中使用过这个吗?它总是回应找不到表,但我已经在开发人员环境中使我的查询工作了。 - eduyayo
谢谢您的查询,但对我没有用。我得到的是大小为0的BLOB。这种方法还需要内部选择进行过滤:“单行子查询返回多行”。 - detoro84
1
只适用于一个列选择。不过是个不错的解决方法。 - Alfabravo

5

是的,这很混乱,但我想不到避免它的方法。
你可以通过将临时表的创建放在存储过程中(并使用“execute immediate”创建表)来向客户端隐藏一些混乱。
需要注意的一件事是,可能会留下一些临时表(如果在会话进行到一半之前出现故障,您还没有时间清理它),您可以安排Oracle作业定期运行并删除任何剩余的表。


2

对于查询数据,user2015502的解决方案是最聪明的。如果您想要在远程数据库中插入或更新LOB(insert into xxx@yyy ...),您可以轻松地使用动态SQL来实现。请参见我的解决方案:


1

你可以使用物化视图来处理所有的“缓存”管理。虽然不是完美的,但在大多数情况下都能起作用 :)


0
你有具体的场景想法吗? 例如,如果LOB保存文件,并且你在公司内部网络上,也许你可以编写一个存储过程将文件提取到网络上已知的目录中,并从那里访问它们。

0
在这种特定情况下,两个系统之间唯一的通信方式是使用dblink。
此外,表格解决方案并不那么糟糕,只是在我的dblink端需要“缓存”数据,有些混乱。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接