Oracle 18c标量子查询取CLOB触发ORA-22922错误:是否为已知Bug及规避方案
Oracle 18c ORA-22922 错误解答
是否为已知Bug?
是的,这是Oracle数据库的已知Bug,存在于12cR2至19c版本(含18c)中,表现为嵌套子查询生成CLOB并配合CONNECT BY递归生成多行时,当返回行数超过一定阈值(通常是10行),就会触发ORA-22922: nonexistent LOB value错误。该问题已在Oracle 23ai中被修复。
规避方法
以下几种方案可解决该问题:
1. 移除嵌套子查询,直接生成CLOB
将嵌套子查询的逻辑合并到主查询中,让Oracle直接为每行生成独立的CLOB值:
SELECT to_clob('123412341234') x FROM dual CONNECT BY LEVEL <= 20;
2. 为子查询添加MATERIALIZE提示
如果业务需要保留子查询结构,可通过/*+ MATERIALIZE */提示强制Oracle先物化子查询结果,再关联到主查询的递归行:
SELECT (SELECT /*+ MATERIALIZE */ to_clob('123412341234') x FROM dual) FROM dual CONNECT BY LEVEL <= 20;
3. 用UNION ALL替代CONNECT BY生成多行(适合行数固定场景)
若需生成的行数固定且数量不多,可通过UNION ALL逐行拼接结果:
SELECT to_clob('123412341234') x FROM dual UNION ALL SELECT to_clob('123412341234') x FROM dual UNION ALL SELECT to_clob('123412341234') x FROM dual -- 重复至目标行数
验证说明
上述方法在Oracle 18c的SQL*Plus及JDBC环境中均可正常执行,能正确返回所有行的CLOB值,不会触发ORA-22922错误。
内容的提问来源于stack exchange,提问作者Lukas Eder
相关产品推荐
相关产品推荐

