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无代码市场,只需一个提示快速构建应用程序
相关推荐
晒太羊的猫1 小时前
jvm面试题全栈练习生2 小时前
AI Agent 沙箱hz567892 小时前
涉密视频会议设备配置指南:终端、音视频采集与配套设施选型广州浮点FLOATLIC2 小时前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题程序员Sunday2 小时前
MySQL 为什么使用 B+ 树索引?把范围查询、回表和覆盖索引连起来半杯咖啡半行码3 小时前
Qt开发实战:数据库、MV 模式、QProcess与串口通信全攻略SEO_juper3 小时前
用 Python 写一个 GEO 可见性检查脚本:你的网站现在能被 AI 引用吗小米里的大麦3 小时前
16 MySQL 事务西柚小萌新3 小时前
【LLM&&AI应用开发 八股文】--4.3.Agent智能体(下)用户8356290780514 小时前
使用 Python 对 Excel 工作表进行排序