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

还有其他想法吗?

4

6 回答 6

16

使用如下查询的最佳解决方案,其中 column_b 是 BLOB:

SELECT (select column_b from sample_table@TEST_LINK) AS column_b FROM DUAL
于 2013-01-27T13:06:25.573 回答
5

是的,它很混乱,但我想不出办法避免它。
您可以通过将临时表创建放在存储过程中(并使用“立即执行”来创建他们的表)来隐藏客户端的一些混乱情况,
您需要注意的一件事是遗留临时表(如果出现故障会话进行到一半,在您有时间清理之前) - 您可以安排一个 oracle 作业定期运行并删除任何剩余的表。

于 2008-09-02T17:53:52.493 回答
2

对于查询数据,user2015502的方案是最聪明的。如果您想在远程数据库中插入或更新 LOB 的AT(插入 xxx@yyy ...),您可以轻松地为此使用动态 SQL。在这里查看我的解决方案:

于 2016-10-06T11:12:51.123 回答
1

您可以使用物化视图来处理所有“缓存”管理。它并不完美,但在大多数情况下都有效:)

于 2008-11-19T19:12:28.293 回答
0

你有一个特定的场景吗?例如,如果 LOB 保存文件,而您在公司 Intranet 上,也许您可​​以编写一个存储过程将文件提取到网络上的已知目录并从那里访问它们。

于 2008-09-01T16:35:58.507 回答
0

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

此外,表解决方案并不是那么糟糕,只是不得不“缓存”我这边的 dblink 数据很麻烦。

于 2008-09-01T16:39:51.277 回答