pl/sql中不能直接调用json_value或json_table,必须通过select into语句借助sql引擎解析;解析数组需用nested path(12.2+)或双层json_table(12.1),且路径相对、类型敏感、空值需显式处理。
不能在 pl/sql 赋值语句里直接调用 json_value 或 json_table —— 它们是 sql 函数,必须走 sql 引擎执行。
PL/SQL 中解析 JSON 必须用 SELECT INTO
PL/SQL 本身没有原生 JSON 解析器,所有解析动作都依赖 SQL 引擎。你不能写 l_val := JSON_VALUE(l_json, '$.x'),这会报 PLS-00222: no function with name 'JSON_VALUE' in scope。
- 正确做法是包裹在
SELECT ... INTO语句中:SELECT JSON_VALUE(json_str, '$.name') INTO l_name FROM DUAL;
- 如果要解析多个字段,建议一次性查出:
SELECT JSON_VALUE(json_str, '$.name'), JSON_VALUE(json_str, '$.age') INTO l_name, l_age FROM DUAL;
- 对数组或复杂结构,必须用
JSON_TABLE,且只能出现在FROM子句 —— 所以要用SELECT ... INTO配合子查询或派生表
处理 JSON 数组时别硬套单层 JSON_TABLE
输入是 [{"id":1,"tags":["a","b"]},{"id":2,"tags":["c"]}],想展开成三行(id=1, tag=a;id=1, tag=b;id=2, tag=c),只用一层 JSON_TABLE 无法做到。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 错误写法:
JSON_TABLE(json_str, '$[*]' COLUMNS (id NUMBER PATH '$.id', tag VARCHAR2(10) PATH '$.tags[0]'))—— 只取每个数组第一个元素,且无法展开全部 - Oracle 12.2+ 推荐用
NESTED PATH:JSON_TABLE(json_str, '$[*]' COLUMNS (id NUMBER PATH '$.id', NESTED PATH '$.tags[*]' COLUMNS (tag VARCHAR2(10) PATH '$')))
- 12.1 只能用双层调用:
SELECT jt1.id, jt2.tag FROM JSON_TABLE(...) jt1, JSON_TABLE(jt1.tags, '$[*]' COLUMNS (tag VARCHAR2(10) PATH '$')) jt2
- 注意:空数组或
"tags": null默认整行丢弃,加NULL ON EMPTY才保留 id 行、tag 为 NULL
路径和类型定义稍错就静默失败或报错
JSON_TABLE 的 COLUMNS 子句对类型敏感,且路径是相对上一级的,不是从根重写。
-
JSON_TABLE(json_col, '$.data' COLUMNS (name VARCHAR2(20) PATH '$.name'))实际查的是$.data.name,不是$.name - JSON 里
"price": 99.95,若定义为price NUMBER(3),直接报ORA-40473: invalid data type for JSON path - 若定义为
price VARCHAR2(5),可能截断为"99.95"(长度够)或"99.9"(精度丢失),不会报错但数据不对 - 返回 JSON 片段(比如子对象)必须显式加
FORMAT JSON,否则 Oracle 尝试转字符串并可能截断
最易被忽略的是:JSON_TABLE 永远不能当表达式用,哪怕只是想取一个字段也要先转成结果集再 SELECT INTO;而路径里的相对性、类型精度、空值行为,全靠手动验证,Oracle 不会提前告诉你哪里错了。










