最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何在Oracle 21c中使用原生JSON数据类型?
时间:2026-08-30 09:18:47 编辑:袖梨 来源:一聚教程网
Oracle 21c 中 JSON 是原生类型,但建表需避让保留字(如 add→address)、必须加 CHECK(soc IS JSON) 约束,JDBC 需 ojdbc11 驱动+oracle.jdbc.json=true 参数及 JsonStructure 映射。
JSON 类型在 Oracle 21c 中是真实可用的原生类型,不是伪类型或 CHECK 约束模拟。但直接写 soc JSON 就建表会失败——因为列名冲突或驱动/语法版本不匹配是最常见拦路虎。
CREATE TABLE 时 JSON 列名不能是 Oracle 保留字
ADD 是 Oracle 的保留关键字(用于 ALTER TABLE ... ADD),所以这个建表语句:
CREATE TABLE a (name VARCHAR2(50), age NUMBER, add VARCHAR2(100), soc JSON);
必然报 ORA-00904: invalid identifier,和 JSON 类型本身无关。
- 把
add改成address、addr或其他非保留字即可 - 强行用双引号包住:
"add"虽然能过语法检查,但后续所有 SQL 都得带引号、大小写敏感、ORM 映射大概率崩,不建议 - 其他常见踩坑列名:
ORDER、LEVEL、TYPE、VALUE—— 建表前先查V$RESERVED_WORDS
JSON 列必须配合 IS JSON 检查约束才生效
Oracle 21c 的 JSON 类型不是“开箱即用”的强类型:它底层依赖 OSON 二进制格式,但仅靠列声明 soc JSON 不自动启用校验或索引优化。
- 必须显式加
CHECK (soc IS JSON),否则插入非法 JSON 不报错,后续JSON_VALUE可能静默返回 NULL - 这个约束不是可选的“锦上添花”,而是触发数据库启用 JSON 语义解析的前提
- 不要只写
CHECK (soc IS JSON STRICT):21c 默认就是 STRICT 模式,STRICT关键字多余,还可能在某些补丁版本报错
JDBC 读取 JSON 列必须启用 oracle.jdbc.json=true
即使表结构完全正确,Java 程序默认拿到的仍是 String 或 CLOB,不是可导航的 JSON 对象。
- 连接 URL 必须带参数:
?oracle.jdbc.json=true(例如:jdbc:oracle:thin:@//host:1521/orclpdb?oracle.jdbc.json=true) - 驱动必须是
ojdbc11(21.10+),ojdbc8不识别该参数,会静默忽略 -
ResultSet.getObject("soc", JsonStructure.class)才能拿到oracle.json.parser.JsonParserImpl$JsonObjectImpl实例;用getString()或getClob()会丢失 OSON 二进制优势,且无法调用.get("x").asNumber()等方法 - 如果用 Spring JdbcTemplate,需在
DataSource初始化时注册类型映射:connection.setTypeMap(Map.of(OracleType.JSON, JsonStructure.class))
写入大 JSON 或含二进制内容时,别依赖 setString()
JSON 列支持 OSON 格式,但 JDBC 层不自动转换:
- 纯文本 JSON 字符串(
{"name":"a"})可用PreparedStatement.setString(),但长度超过 4000 字节时,ojdbc11可能截断或报ORA-40495 - 含二进制字段(如 Base64 图片)必须用
setBytes()+UTL_RAW.CAST_TO_RAW()包装,或走setClob()配合StringReader - 最稳妥方式:统一用
OraclePreparedStatement.setObject(colIndex, jsonValue, OracleType.JSON),其中jsonValue是JsonStructure实例(由Json.createStructure()构造)
最易被忽略的一点:21c 的 JSON 类型和 19c 的 JSON 列行为不兼容——前者强制 OSON 存储、后者仍是文本+CHECK,混用会导致 JDBC 读取逻辑彻底失效。
相关文章
- 工业专网对讲机通讯寒地工程化落地实战报错怎么办-环境权限排查 08-30
- AI进阶术语有哪些-ML和深度学习概念 08-30
- 迁移学习的工程化实践从预训练权重到可怎么配置-关键参数别漏 08-30
- TPLink TLWR845N 无线路由器WDS桥接设置 08-30
- 意图识别精准度升级方案值不值得用-能力限制 08-30
- AI 新手村:让大模型学会操作浏览器怎么做-执行顺序和关键限制 08-30