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

时间:2020-03-05 18:46:02  来源:igfitidea点击:

如果创建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

还有其他想法吗?

解决方案

回答

我们有特定的想法吗?
例如,如果LOB存放文件,并且我们在公司的Intranet上,则可以编写存储过程以将文件提取到网络上的已知目录并从那里访问它们。

回答

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

而且,表解决方案并不是那么糟糕,必须将数据"缓存"在dblink的那一边只是一团糟。

回答

是的,这很混乱,不过我想不出办法避免这种情况。
我们可以通过将临时表创建放入存储过程中(并使用"立即执行"来创建表)来向客户端隐藏一些混乱情况。
我们需要注意的一件事是保留在临时表上(如果在会话进行中途出现故障,在没有时间清理之前),我们可以安排一个oracle作业来定期运行并删除所有遗留的表。

回答

我们可以使用综合视图来处理所有"缓存"管理。它不是完美的,但在大多数情况下都可以工作:)