Oracle 19c中JSON_OBJECT最后值无引号及类型报错问题咨询
Oracle 19c JSON_OBJECT(FORMAT JSON) 异常问题分析
这是Oracle 19c版本中的已知bug,并非你的使用误区。
你遇到的异常现象汇总
- 多字符串值时最后一个未被引号包裹
执行SQL:
SELECT json_object( 'a' value 'blah', 'b' value 'blah', 'c' value 'blah' FORMAT JSON) FROM dual
输出结果:
{"a":"blah","b":"blah","c":blah}
最后一个blah缺失引号,不符合JSON规范。
- 混合数字与字符串值时,字符串值未被引号包裹
执行SQL:
SELECT json_object( 'a' value 1, 'b' value 2, 'c' value 'blah' FORMAT JSON) FROM dual
输出结果:
{"a":1,"b":2,"c":blah}
字符串blah未被引号包裹。
- 全数字值时报类型不匹配错误
执行SQL:
SELECT json_object( 'a' value 1, 'b' value 2, 'c' value 3 FORMAT JSON) FROM dual
报错信息:
Error starting at line : 1 in command - SELECT json_object( 'a' value 1, 'b' value 2, 'c' value 3 FORMAT JSON) FROM dual Error at Command Line : 4 Column : 15 Error report - SQL Error: ORA-00932: inconsistent datatypes: expected CHAR got NUMBER 00932. 00000 - "inconsistent datatypes: expected %s got %s" *Cause: *Action:
问题原因
该bug源于FORMAT JSON子句的类型推断逻辑缺陷:
- 当JSON_OBJECT中存在混合类型值,或最后一个值为字符串时,Oracle的JSON序列化逻辑出现异常,无法正确给字符串值添加引号;
- 当所有值均为数字类型时,错误地要求值为CHAR类型,触发类型不匹配错误。
解决方案
- 显式统一值类型:使用
TO_CHAR()函数包裹所有值,确保类型一致,避免类型推断错误:
SELECT json_object( 'a' value TO_CHAR(1), 'b' value TO_CHAR(2), 'c' value TO_CHAR('blah') FORMAT JSON) FROM dual;
执行后会输出符合规范的JSON:
{"a":"1","b":"2","c":"blah"}
- 升级Oracle版本:将数据库升级到19c的更高补丁版本(建议查看Oracle官方修复列表确认对应补丁),或直接升级到Oracle 21c及以上版本,该问题在后续版本中已被官方修复。
内容的提问来源于stack exchange,提问作者Graham
相关产品推荐
相关产品推荐

