我正在编写一些用于数据迁移的脚本,插入部分(插入到...选择)到目前为止工作得很好。但是,验证语句会出现以下错误:
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中不起作用。
我该怎么办?
答案 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;