首选apex_json(需已安装apex),因其开箱即用、线程安全、支持嵌套与数组遍历;若不可用则须手动安装pl/json;禁用instr+substr等硬解析反模式,且必须先parse再get_*,不可直接对rest响应clob用json_value。

Oracle 11g/12c+ 原生不支持直接解析任意结构的 REST 响应 JSON 字符串,必须依赖 PL/JSON 库或 APEX_JSON(仅限 APEX 环境);否则会报 ORA-20101: JSON parser failed 或 PLS-00201: identifier 'APEX_JSON' must be declared。
确认环境是否已安装 APEX_JSON(最简路径)
如果你的数据库已部署 Oracle APEX(常见于云数据库、ORDS 环境或手动安装过 APEX),APEX_JSON 是开箱即用的首选——它无需额外安装、线程安全、支持嵌套和数组遍历,且与 APEX_WEB_SERVICE 天然配合。
- 执行
SELECT COUNT(*) FROM all_objects WHERE object_name = 'APEX_JSON' AND object_type = 'PACKAGE';,返回 >0 即可用 - 若不可用,别硬写
JSON_VALUE——该函数只适用于已存入JSON类型列的值,不能解析 RAW/STRING 响应体 - 常见错误:调用
APEX_WEB_SERVICE.MAKE_REST_REQUEST后直接对返回的CLOB用JSON_VALUE,结果报ORA-40442: JSON path expression is not supported——因为没先用APEX_JSON.PARSE加载
用 APEX_JSON.PARSE 解析 REST 响应 CLOB
关键点:必须先 PARSE 再 GET_*,不能跳步。响应体是 CLOB 时需显式转换,否则 APEX_JSON.PARSE 可能静默失败或截断。
- 正确写法:
APEX_JSON.PARSE(l_json_clob);(l_json_clob是APEX_WEB_SERVICE.MAKE_REST_REQUEST返回值) - 若响应是
VARCHAR2(如小数据量),可直接传入:APEX_JSON.PARSE(l_json_str); - 提取字段示例:
APEX_JSON.GET_VARCHAR2(p_path => 'user.name')、APEX_JSON.GET_NUMBER(p_path => 'data.items[0].price') - 遍历数组用
APEX_JSON.GET_COUNT(p_path => 'items')+ 循环GET_*,索引从 1 开始(不是 0)
无 APEX 环境?必须手动安装 PL/JSON
PL/JSON 是唯一成熟、长期维护的纯 PL/SQL JSON 库,但安装步骤多、权限敏感,且默认不带数组迭代器——容易卡在“知道有数组但取不出第 2 个元素”。
- 安装前需确认当前用户有
CREATE TYPE、CREATE PROCEDURE权限,且执行install.sql时连接的是sys或具有DBA角色的账户 - 安装后需运行
grantsandsynonyms.sql,否则普通用户调用json()构造函数会报PLS-00201: must be declared - 解析字符串:用
json(v_clob_or_string)构造对象,再用.get('key').get_string链式调用;数组需转为json_list类型后用.get(i).get_string - 注意:PL/JSON 的
json_parser对非法空白(如 Windows 换行 \r\n)更敏感,REST 响应若含不可见控制字符,需先REPLACE(REPLACE(v_raw, CHR(13)), CHR(10))
避免把 JSON 当字符串硬拆(典型反模式)
用 INSTR+SUBSTR 手动截取 key/value 是高危操作:无法处理嵌套、引号转义、数组边界、空格容错,且一旦 API 响应格式微调(如字段重命名、加新字段),代码立即崩溃。
- 错误示例:
SUBSTR(l_resp, INSTR(l_resp, '"id":')+5, 10)—— 假设 id 总是数字且长度 ≤10,实际可能为字符串、null 或超长 - 真正需要容错时,应改用
APEX_JSON.FIND_PATH检查路径是否存在,再取值;或用 PL/JSON 的.path_exists方法 - 性能提示:
APEX_JSON.PARSE是内存解析,大 JSON(>1MB)可能触发 PGA 内存溢出;此时应考虑用外部表或 Java 存储过程分流
最易被忽略的一点:REST 响应的字符集。如果 API 返回 UTF-8 编码但数据库字符集是 AL32UTF8,通常没问题;但若数据库是 WE8MSWIN1252,而 JSON 含中文,APEX_JSON.PARSE 会静默丢弃乱码部分——务必在 MAKE_REST_REQUEST 中显式指定 p_charset => 'UTF-8',并检查响应头 Content-Type: application/json; charset=utf-8 是否一致。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











