在Oracle中,如何从远程数据库中选择LOB而不复制到本地表?

时间:2015-06-11 10:46:51

标签: sql oracle blob clob

我正在编写一些用于数据迁移的脚本,插入部分(插入到...选择)到目前为止工作得很好。但是,验证语句会出现以下错误:

22992. 00000 -  "cannot use LOB locators selected from remote tables"

这是从远程数据库中选择CLOB列引起的:

 select sum(owa_opt_lock.checksum(clobCol)) into x_var from TableA@OLD_DB;   
 select sum(owa_opt_lock.checksum(clobCol)) into y_var from TableA;
 --Compare the check sums to verify if migration succeed

在研究之后,似乎这个错误的标准解决方案是事先将数据复制到本地表。但是这会破坏验证的目的,因为复制到本地表时可能会发生损坏!

我发现网络的另一个解决方案是执行以下操作:

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

据说可以在早期版本的Oracle上运行但在12C中不起作用。

我该怎么办?

1 个答案:

答案 0 :(得分:0)

您无需在dblink中提取CLOB 只需调用远程数据库上的owa_opt_lock.checksum函数即可 这样只会将结果数传回。

 select sum(owa_opt_lock.checksum@OLD_DB(clobCol)) into x_var from TableA@OLD_DB;

如果 确实 需要将CLOB拉过dblink,则可以使用 lob_over_dblink.get_clob 功能。
https://github.com/HowdPrescott/Lob_Over_DBLink

 select sum(owa_opt_lock.checksum(
            lob_over_dblink.get_clob('OLD_DB', 'TableA', 'clobCol', rowid)
        )) into x_var from TableA@OLD_DB;

为了完整性,我将提到owa_opt_lock.checksum会为长度超过4000字节的CLOB抛出ORA-22835异常。
如果你想用它来安全地跨越单个CLOB校验和,你可以这样做:

 select owa_opt_lock.checksum@OLD_DB(clobCol)
   from TableA@OLD_DB
  where dbms_lob.getlength@OLD_DB((select clobCol from dual@OLD_DB)) <= 4000;