Oracle PL/SQL:如何获取HCLOB中JSON数组action的多个值?
好问题!确实JSON_VALUE只能提取单个标量值,没法直接处理数组类型的action字段。不过Oracle提供了专门的工具来解决这类JSON数组提取的需求,下面给你两种实用的方案:
解决方案1:用
JSON_TABLE拆分数组成多行 这是最灵活的方法,能把action数组里的每个值拆成独立的行,方便后续处理。假设你的表名为your_table,存储HCLOB的列名为hclob_data,可以用如下SQL:
SELECT relist.name, action.item AS action_value FROM your_table, JSON_TABLE( hclob_data, '$.relist[*]' COLUMNS ( name VARCHAR2(100) PATH '$.name', -- 嵌套遍历action数组 NESTED PATH '$.action[*]' COLUMNS ( item VARCHAR2(100) PATH '$' ) ) ) relist;
说明:
JSON_TABLE会先遍历relist数组中的每个对象(你的示例里只有一个)- 通过
NESTED PATH深入到每个relist对象下的action数组,把每个元素单独提取成一行 - 执行后你会得到两行结果,分别对应
Manager和Specific User List,同时关联对应的name值
解决方案2:把数组值拼接成单个字符串返回
如果你希望把两个action值合并成一个字符串(比如用逗号分隔),可以结合LISTAGG聚合函数和JSON_TABLE:
SELECT relist.name, LISTAGG(action.item, ', ') WITHIN GROUP (ORDER BY action.item) AS combined_actions FROM your_table, JSON_TABLE( hclob_data, '$.relist[*]' COLUMNS ( name VARCHAR2(100) PATH '$.name', NESTED PATH '$.action[*]' COLUMNS ( item VARCHAR2(100) PATH '$' ) ) ) relist GROUP BY relist.name;
说明:
- 先通过
JSON_TABLE拆分数组,再用LISTAGG把同一name下的所有action值拼接成一个字符串 - 执行结果会返回一行,
combined_actions字段的值为Manager, Specific User List
需要注意的是,这两种方法都要求你的Oracle版本是12c及以上(JSON_TABLE是12c引入的特性),这也是目前处理这类JSON数组场景的最优选择。
内容的提问来源于stack exchange,提问作者user2854333
相关产品推荐
相关产品推荐

