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

Oracle中将JSON解析为自定义对象类型集合的更优实现方法

更优实现方案

你当前的写法是兼容低版本Oracle的通用写法,在12c及以上版本中有更简洁、性能更好的实现方式,不需要手动映射列、手动构造对象实例。


方案1:12cR2(12.2.0.1)及以上版本最优写法

Oracle从12cR2开始支持直接将JSON结构映射为用户自定义的对象/集合类型,只要JSON的key名和你定义的对象属性名完全匹配(你当前场景中id/name完全对应),可以直接通过json_value一次性完成整个JSON数组到t_ref_tbl集合的转换,不需要走json_table拆行、bulk collect逐行收集的流程,内部序列化开销更低,代码也最简洁:

declare
    var_ref_tbl t_ref_tbl;
begin
    select json_value(
        '[{"id":1, "name":"one"}, {"id":2, "name":"two"}]',
        '$' returning t_ref_tbl
    ) into var_ref_tbl
    from dual;
end;
/

如果存在JSON key和对象属性名不匹配的场景,可以先对JSON做key重命名后再做转换,不需要修改现有类型定义。


方案2:12cR1(12.1.0.x)版本简化写法

如果是12.1版本不支持直接返回集合类型,可以优化你现有的json_table写法,不需要手动拆列、手动构造t_ref_rec实例,直接将JSON数组的每个元素映射为t_ref_rec对象即可,减少冗余的字段映射代码:

declare
    var_ref_tbl t_ref_tbl;
begin
    select t_ref_rec
    bulk collect into var_ref_tbl
    from json_table(
        '[{"id":1, "name":"one"}, {"id":2, "name":"two"}]',
        '$[*]' columns (
            t_ref_rec format json path '$'
        )
    );
end;
/

版本说明

  • 如果你的Oracle版本低于12cR1,没有更简化的实现方式,你当前使用的手动映射列+构造对象的写法就是标准可行方案。
  • 数据量越大,方案1的性能优势越明显,避免了SQL引擎和PL/SQL引擎切换、逐行构造对象的额外开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 10:18:08