背景:
通过dblink的方式跨库查询将数据插入到本地库,但是报错ORA-22992,但是明明我的select里面并没有查询到lob字段呀,为什么还会报ORA-22992:无法使用从远程表选择的LOB定位符? 这是因为oracle隐式调用了lob字段导致的!(太鸡贼了)
SQL举例:
INSERT INTO test
(id,
NAME,
VERSION,
)
SELECT a.id,
a.name,
a.version,
a.valid,
FROM user.bbb@dblink a
LEFT JOIN user.ccc@dblink b ON a.ID=b.id
隐式 LOB 引用:即使你的 SELECT
未显式选择 LOB 字段,如果关联表(如 bbb@dblink a
、user.ccc@dblink b
)中包含 LOB 字段(如 CLOB
类型的备注列),Oracle 可能会在分布式查询中尝试隐式引用这些字段。
验证: 删除掉left join以后能够正常执行,并且发现确实bbb与ccc表存在lob字段
说明:发现跨库的几张表中确实存在lob字段列,虽然并没有被sql显示地引用,但是被left join隐式调用了
解决方案:
原sql
LEFT JOIN user.ccc@dblink b ON a.ID=b.id
转换成,显式排除 LOB 字段
LEFT JOIN (
SELECT
id -- 只选择需要的字段
user.ccc@dblink b
) b ON a.id = b.id