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无代码市场,只需一个提示快速构建应用程序
相关推荐
BU摆烂会噶1 小时前
【工作流的常见模式】LangGraph 常用模式:路由模式(条件分支)qq_413502022 小时前
AWS CodeBuild 配置 PHP 8.0 运行时的正确方法guslegend2 小时前
AI生图第2节:python对接gpt-image-2模型API生图yanghuashuiyue3 小时前
LangGraph框架研究-开发测试禹凕3 小时前
PyTorch——安装(有无 NVIDIA 显卡的完整配置方案)卷心菜狗3 小时前
Python进阶--迭代器人道领域4 小时前
【Redis实战篇】初步基于Redis实现的分布式锁---基于黑马点评dragen_light4 小时前
5.ROS2-Topics-Publisher-Subscriberjr-create(•̀⌄•́)4 小时前
LeakyRelu链式法则