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

Oracle APEX GET API创建报错:SQL查询在SQL Workshop正常运行

问题描述

我编写的SQL查询在SQL Workshop中运行正常,生成的JSON格式也验证无误,但创建GET类型Rest API时出现报错。

SQL查询语句:

SELECT 'application/json' as content_type, JSON_OBJECT (
         KEY 'departments' VALUE (
           SELECT JSON_ARRAYAGG(
                    JSON_OBJECT (
                      KEY 'department_name' VALUE d.DEPARTMENT_NAME,
                      KEY 'department_no' VALUE d.DEPARTMENT_ID,
                      KEY 'employees' VALUE (
                        SELECT JSON_ARRAYAGG (
                                 JSON_OBJECT(
                                   KEY 'employee_number' VALUE e.EMPLOYEE_ID,
                                   KEY 'employee_name' VALUE e.FIRST_NAME
                                 )
                               )
                        FROM   OEHR_EMPLOYEES e
                        WHERE  e.DEPARTMENT_ID = d.DEPARTMENT_ID
                        
                      )
                    )
                  )
           FROM   OEHR_DEPARTMENTS d
           where d.DEPARTMENT_ID in (10,20,30)
         )
       ) AS departments
FROM   dual;

报错信息:
ORA-00904: "D"."DEPARTMENT_ID": invalid identifier,即内层子查询无法识别外层表的别名d。

解决方案

该问题源于Oracle REST Data Services (ORDS) 对嵌套JSON子查询的别名解析存在上下文限制,可通过以下两种方式修复:

方式1:用WITH子句重构查询,明确层级关系

将部门与员工的关联查询提前定义,避免深层嵌套导致的别名识别问题:

WITH dept_emps AS (
    SELECT 
        d.DEPARTMENT_ID,
        d.DEPARTMENT_NAME,
        JSON_ARRAYAGG(
            JSON_OBJECT(
                KEY 'employee_number' VALUE e.EMPLOYEE_ID,
                KEY 'employee_name' VALUE e.FIRST_NAME
            )
        ) AS employees
    FROM OEHR_DEPARTMENTS d
    LEFT JOIN OEHR_EMPLOYEES e ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
    WHERE d.DEPARTMENT_ID IN (10,20,30)
    GROUP BY d.DEPARTMENT_ID, d.DEPARTMENT_NAME
)
SELECT 
    'application/json' AS content_type,
    JSON_OBJECT(
        KEY 'departments' VALUE JSON_ARRAYAGG(
            JSON_OBJECT(
                KEY 'department_name' VALUE DEPARTMENT_NAME,
                KEY 'department_no' VALUE DEPARTMENT_ID,
                KEY 'employees' VALUE employees
            )
        )
    ) AS departments
FROM dept_emps;

方式2:强化子查询的关联条件声明

在员工子查询中添加显式条件,确保外层表别名能被正确识别:

SELECT 'application/json' as content_type, JSON_OBJECT (
         KEY 'departments' VALUE (
           SELECT JSON_ARRAYAGG(
                    JSON_OBJECT (
                      KEY 'department_name' VALUE d.DEPARTMENT_NAME,
                      KEY 'department_no' VALUE d.DEPARTMENT_ID,
                      KEY 'employees' VALUE (
                        SELECT JSON_ARRAYAGG (
                                 JSON_OBJECT(
                                   KEY 'employee_number' VALUE e.EMPLOYEE_ID,
                                   KEY 'employee_name' VALUE e.FIRST_NAME
                                 )
                               )
                        FROM   OEHR_EMPLOYEES e
                        WHERE  e.DEPARTMENT_ID = d.DEPARTMENT_ID
                        AND d.DEPARTMENT_ID IS NOT NULL
                      )
                    )
                  )
           FROM   OEHR_DEPARTMENTS d
           where d.DEPARTMENT_ID in (10,20,30)
         )
       ) AS departments
FROM   dual;

额外说明

ORDS对嵌套子查询的JSON生成支持不如SQL Workshop灵活,采用JOIN+GROUP BY的WITH子句写法,既能避免别名解析问题,还能提升查询性能,更适合作为REST API的数据源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 06:03:15