Oracle 19c JSON列必须声明为JSON类型并配合RETURNING显式指定返回类型,否则无法启用自动类型映射、索引下推和数值运算;已有表需通过ADD-UPDATE-DROP迁移,且JSON_TABLE是唯一支持数组展开与类型绑定的方式。Oracle 19c JSON列必须用 JSON 约束,不能只靠 IS JSON 检查很多人以为在 create table 里加个 check (col is json) 就能当 json 列用,其实不行------这只能做插入校验,不触发 oracle 内置的 json 自动类型映射(比如把 {"id": 123} 的 id 当数字处理)。真要启用自动映射,必须显式声明列类型为 json:CREATE TABLE orders ( id NUMBER, payload JSON);这样 Oracle 才会启用 JSON 值的内部结构感知,后续用 . 路径访问时才能正确推导字段类型、支持函数下推(如 JSON_VALUE(payload, '.amount' RETURNING NUMBER) 直接走索引)。常见错误现象:JSON_VALUE 返回字符串而非数字,JSON_TABLE 报 ORA-40478,或谓词无法下推导致全表扫描。JSON 类型列要求 Oracle 19c+ 且兼容级别 ≥ 19.0(检查 VVERSION 和 COMPATIBLE 参数)如果已有表,不能直接 ALTER COLUMN ... TYPE JSON,得先 ADD 新列 → UPDATE 迁移 → DROP 旧列从 19c 开始,JSON 类型列默认启用严格模式(STRICT),非法 JSON 会直接拒绝插入,不像 IS JSON 那样容忍空格/注释自动类型映射依赖 RETURNING 显式声明,不是"智能推断"Oracle 不会根据 JSON 内容自动决定返回什么 SQL 类型。哪怕你存的是 {"price": 99.99},JSON_VALUE(payload, '.price') 默认返回 VARCHAR2(4000),不是 NUMBER。必须写明 RETURNING:SELECT JSON_VALUE(payload, '$.price' RETURNING NUMBER) AS price_numFROM orders;否则所有数值都当字符串处理,排序、比较、索引都会出错(比如 '10' > '9' 成立,但数值上是错的)。使用场景:报表取值、JOIN 条件、WHERE 中范围查询(JSON_VALUE(...) > 100)。RETURNING 支持 NUMBER、DATE、TIMESTAMP、VARCHAR2(n),不支持 BOOLEAN(JSON boolean 在 Oracle 中只能转成 VARCHAR2 或用 JSON_EXISTS 判断)若 JSON 字段可能为空或缺失,加 NULL ON ERROR(默认行为),避免报 ORA-40476性能影响:带 RETURNING NUMBER 的表达式可被函数索引覆盖;纯字符串返回则无法利用数值索引JSON_TABLE 是唯一支持"展开 JSON 数组 + 自动类型绑定"的方式想把 {"items": {"qty": 2}, {"qty": 5}} 展开成两行,并让 qty 直接是数字?不用自己 REGEXP_SUBSTR 解析。用 JSON_TABLE + COLUMNS 子句明确类型即可: Felvin AI无代码市场,只需一个提示快速构建应用程序
相关推荐
龙腾AI白云2 分钟前
大语言模型:从语言理解到通用智能的跃迁安易算力4 分钟前
PUE优化工程实践:从1.5到1.2的制冷架构与气流组织改造路径troy12824 分钟前
Codex 安全盲区:代码漏洞生成实测SelectDB34 分钟前
快手基于 Apache Doris 千亿多模态检索的实践SelectDB40 分钟前
StarRocks 迁移至 Apache Doris 完整指南:三步完成结构、数据与业务平滑切换这个DBA有点耶40 分钟前
InnoDB索引组织表下,复合主键和自增主键的物理存储差异与选型对比嵌入式学习菌1 小时前
Workbuddy自动写一个RS485 / LoRa 参数调试工具其实防守也摸鱼1 小时前
常见安全架构中 Shiro 的认证确认机制解析钱栈up2 小时前
番茄小说榜单爬虫失效排查:从页面路由变更到API参数映射的全流程复盘唐璜Taro2 小时前
Agent Harness 系列 · 第 1 篇|Agent 不只是换一个更强的模型