You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 19c中JSON_OBJECT最后值无引号及类型报错问题咨询

Oracle 19c JSON_OBJECT(FORMAT JSON) 异常问题分析

这是Oracle 19c版本中的已知bug,并非你的使用误区。

你遇到的异常现象汇总

  1. 多字符串值时最后一个未被引号包裹
    执行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规范。

  1. 混合数字与字符串值时,字符串值未被引号包裹
    执行SQL:
SELECT json_object(
    'a' value 1,
    'b' value 2,
    'c' value 'blah'
    FORMAT JSON)
FROM dual

输出结果:

{"a":1,"b":2,"c":blah}

字符串blah未被引号包裹。

  1. 全数字值时报类型不匹配错误
    执行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类型,触发类型不匹配错误。

解决方案

  1. 显式统一值类型:使用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"}
  1. 升级Oracle版本:将数据库升级到19c的更高补丁版本(建议查看Oracle官方修复列表确认对应补丁),或直接升级到Oracle 21c及以上版本,该问题在后续版本中已被官方修复。

内容的提问来源于stack exchange,提问作者Graham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 21:23:33