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
相关产品推荐
相关产品推荐

