在 Oracle 分布式数据库中处理 LOB 的最佳方法
-
09-06-2019 - |
题
如果创建 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
还有其他想法吗?
解决方案
是的,这很混乱,但我想不出办法来避免它。
您可以通过将临时表创建放入存储过程中(并使用“立即执行”来创建表)来隐藏客户端的一些混乱情况
您需要注意的一件事是遗留的临时表(如果在会话中途发生故障,在您有时间清理之前) - 您可以安排一个 oracle 作业定期运行并删除任何遗留的表。
其他提示
最佳解决方案是使用如下查询,其中 column_b 是 BLOB:
SELECT (select column_b from sample_table@TEST_LINK) AS column_b FROM DUAL
您可以使用物化视图来处理所有“缓存”管理。它并不完美,但在大多数情况下都有效:)
对于查询数据来说,user2015502的方案是最聪明的。如果您想插入或更新 LOB 在 远程数据库(插入 xxx@yyy ...),您可以轻松地使用动态 SQL。看 我的解决方案在这里:
您有特定的场景吗?例如,如果 LOB 保存文件,并且您位于公司 Intranet 上,则也许您可以编写一个存储过程来将文件提取到网络上的已知目录并从那里访问它们。
在这种特定情况下,两个系统通信的唯一方法是使用 dblink。
另外,表解决方案并没有那么糟糕,只是必须将数据“缓存”在我这边的 dblink 上,这很混乱。
不隶属于 StackOverflow