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

如何在ORDS中对数组内的值执行查询过滤

解决ORDS API中CURSOR生成数组的过滤问题

问题核心

你遇到的问题是ORDS内置查询过滤功能对CURSOR生成的嵌套JSON数组支持有限,导致尝试的过滤语法要么触发400请求错误,要么返回403禁止访问。

原因分析

ORDS的内置查询过滤主要针对直接映射的表列,而CURSOR返回的是动态生成的游标结果集,ORDS无法直接解析这类嵌套结构的过滤条件,这就是报错的根本原因:

  • 400错误:过滤语法存在格式问题(比如引号不配对),或者过滤字段名与返回JSON的实际字段名不匹配(你用了active,但SQL返回的是IS_ACTIVE)
  • 403错误:ORDS尝试解析游标嵌套结构的过滤条件时,调用了不存在的内部函数,触发权限/函数不存在的报错

解决方案

方案1:直接在SQL中过滤(推荐)

既然目标是只返回活跃连接,最直接的方式是修改原SQL,在CURSOR的子查询里直接添加过滤条件,不需要依赖ORDS的过滤功能:

select :customer_id as CUSTOMER_ID, 
       CURSOR(SELECT CONNECTION_ID, IS_ACTIVE 
              from CONNECTIONS 
              where CONNECTION_CUSTOMER_ID = :customer_id
                AND IS_ACTIVE = 1) AS CONNECTIONS 
FROM DUAL

如果需要动态控制是否过滤(比如允许用户通过参数选择是否只看活跃连接),可以添加一个查询参数(比如?active=1),然后在SQL中绑定该参数:

select :customer_id as CUSTOMER_ID, 
       CURSOR(SELECT CONNECTION_ID, IS_ACTIVE 
              from CONNECTIONS 
              where CONNECTION_CUSTOMER_ID = :customer_id
                AND (:active IS NULL OR IS_ACTIVE = :active)) AS CONNECTIONS 
FROM DUAL

用户请求https://myapi.test/data/customer/12345/connections?active=1时返回活跃连接,不带参数则返回全部连接。

方案2:改用JSON函数生成数组以支持ORDS过滤

如果必须使用ORDS的内置过滤功能,需要把CURSOR替换为JSON_ARRAYAGG生成标准JSON数组,ORDS可以识别这种结构并应用过滤:

select :customer_id as CUSTOMER_ID,
       (SELECT JSON_ARRAYAGG(JSON_OBJECT('CONNECTION_ID' VALUE CONNECTION_ID, 'IS_ACTIVE' VALUE IS_ACTIVE))
        FROM CONNECTIONS
        WHERE CONNECTION_CUSTOMER_ID = :customer_id) AS CONNECTIONS
FROM DUAL

此时可以使用正确的ORDS过滤语法(注意字段名要和JSON中的键名完全一致,区分大小写):

# 过滤活跃连接
https://myapi.test/data/customer/12345/connections?q={"connections[*].IS_ACTIVE":1}

# 过滤特定connection_id
https://myapi.test/data/customer/12345/connections?q={"connections[*].CONNECTION_ID":123}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:03:12