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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:47:20