JSON 系列之1:将 JSON 数据存储在 Oracle 数据库中

news2024/12/25 16:05:06

本文为Oracle数据库JSON学习系列的第一篇,讲述如何将JSON文档存储到数据库中,包括了版本为19c和23ai的情形。

19c中的JSON

先来看一下数据库版本为19c时的情形。

创建表colortab,其中color列的长度设为4000。若color的长度需要设为32767,则init.ora 参数 MAX_STRING_SIZE 必须设置为 EXTENDED。

DROP TABLE colortab PURGE;

CREATE TABLE colortab (
    id    NUMBER,
    color VARCHAR2(4000)
);

插入4条数据:

INSERT INTO colortab VALUES ( 1,
                              '
 {
  "color": "black",
  "rgb": [0,0,0],
  "hex": "#000000"
 }
' );

INSERT INTO colortab VALUES ( 2,
                              '
 {
  "color": "orange red",
  "rgb": [255,69,0],
  "hex": "#FF4500"
 }
' );

INSERT INTO colortab VALUES ( 3,
                              '
 {
  color: "gold",
  "rgb": [255,215,0],
  "hex": "#FFD700 "
 }
' );

INSERT INTO colortab VALUES ( 4,
                              'I am not valid JSON' );

COMMIT;

查看这些记录,会发现记录3的color字段并没有用双引号括起,于严格的JSON定义不符,但松散的JSON定义是允许的:
在这里插入图片描述
这可以通过如下来证明:

SQL> set echo on
SQL> SELECT id FROM colorTab WHERE color IS NOT JSON;

        ID
----------
         4

SQL> 
SQL> SELECT id FROM colorTab WHERE color IS NOT JSON STRICT;

        ID
----------
         3
         4

在Oracle 23ai JSON Developer’s Guide中,松散的语法称为Lax JSON Syntax,是默认的。严格的则称为Strict JSON Syntax。

插入一条新纪录,此记录符合Strict JSON Syntax,但具有重复的key:“color”。

INSERT INTO colortab VALUES ( 5,
                              '
 {
  "color": "black",
  "rgb": [0,0,0],
  "hex": "#000000",
  "color": "white"
 }
' );

COMMIT;

子句可以排除具有重复key的JSON。不过检查重复键是有代价的,所以一般是不做的:

SQL> SELECT id FROM colorTab WHERE color IS JSON STRICT;

        ID
----------
         1
         2
         5


SQL> SELECT id FROM colorTab WHERE color IS JSON STRICT WITH UNIQUE KEYS;

        ID
----------
         1
         2

如果只想让列存合法的JSON,在19c版本可以通过IS JSON约束。

TRUNCATE TABLE colorTab;

ALTER TABLE colorTab ADD CONSTRAINT ensure_json CHECK (color IS JSON);

此时,插入记录4时报错:

错误报告 -
ORA-02290: 违反检查约束条件 (SSB.ENSURE_JSON)

https://docs.oracle.com/error-help/db/ora-02290/

如果约束是CHECK (color IS JSON STRICT),则插入记录4时报错同上。

JSON的信息可以从字典视图中查看:

col table_name for a10
col column_name for a16
SELECT * FROM USER_JSON_COLUMNS WHERE table_name = 'COLORTAB';

TABLE_NAME OBJEC COLUMN_NAME      FORMAT    DATA_TYPE    
---------- ----- ---------------- --------- -------------
COLORTAB   TABLE COLOR            TEXT      VARCHAR2   

最后再说一点,上例中的JSON是用VARCHAR2来存的,此外还可以用CLOB和BLOB。通常会建议BLOB,因为BLOB占用空间更小,从而引发的I/O更少。

Internally, CLOB encodes characters as UCS2 (similar to UTF16) which means every character takes up two bytes. BLOB does not perform such re-encoding but instead stores the Unicode (UTF8) bytes unmodified - thus requiring half the storage size for ASCII characters, and half the IO to load it.

23ai中的JSON

23ai支持原生JSON,因此表的定义变为:

drop table colortab purge;
CREATE TABLE colortab (
    id    NUMBER,
    color JSON
);

JSON 数据类型的实例使用 OSON 格式存储。OSON 是 Oracle 针对 Oracle 数据库服务器和 Oracle 数据库客户端中的查询和更新而优化的二进制 JSON 格式。

根据Oracle Database JSON Capabilities Specification,单个JSON实例的存储限制为32MB。

此时插入之前的5条数据。

插入记录4时,报错如下:

错误报告 -
ORA-40441: JSON 语法错误
JZN-00078: Invalid JSON keyword 'I' (line 1, position 1)

https://docs.oracle.com/error-help/db/ora-40441/

More Details :
https://docs.oracle.com/error-help/db/ora-40441/
https://docs.oracle.com/error-help/db/jzn-00078/

插入记录5时,报错如下:

错误报告 -
SQL 错误: ORA-40473: JSON 对象中存在重复的键名 'color'
JZN-00007: Object member key 'color' is not unique

https://docs.oracle.com/error-help/db/ora-40473/40473. 00000 -  "duplicate key names '%s' in JSON object"
*Cause:    The provided JavaScript Object Notation (JSON) data had duplicate
           key names in one object.
*Action:   Provide JSON data with unique key names in each JSON object.

More Details :
https://docs.oracle.com/error-help/db/ora-40473/
https://docs.oracle.com/error-help/db/jzn-00007/

这说明23ai JSON默认语法是Lax JSON Syntax,并且不允许重复键。文档 也是这么说的:

JSON 标准建议 JSON 对象不要有重复的字段名称。Oracle 数据库通过引发错误来强制 JSON 类型数据遵循此要求。

查看字典视图,数据类型为JSON,存储格式为OSON:

SQL> col table_name for a10
SQL> col column_name for a16
SQL> SELECT * FROM USER_JSON_COLUMNS WHERE table_name = 'COLORTAB';

TABLE_NAME OBJEC COLUMN_NAME      FORMAT    DATA_TYPE    
---------- ----- ---------------- --------- -------------
COLORTAB   TABLE COLOR            OSON      JSON         

Oracle称所有非OSON存储的JSON为文本JSON(Textual JSON)。

JSON数据类型无法指定Strict JSON Syntax,按照文档5.3 Specifying Strict or Lax JSON Syntax 的说法:

Oracle 数据库的默认 JSON 语法是宽松的。严格或宽松语法仅对 SQL/JSON 条件 is json 和 is not json 有意义。所有其他 SQL/JSON 函数和条件都使用宽松语法来解释输入,并在返回输出时使用严格语法。

如果您需要确保特定文本 JSON 数据具有严格正确的语法,请先使用 is json 或 is not json 进行检查。

参考

  • Storing JSON data in the Oracle database
  • JSON Developer’s Guide

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2265367.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【从零开始入门unity游戏开发之——unity篇02】unity6基础入门——软件下载安装、Unity Hub配置、安装unity编辑器、许可证管理

文章目录 一、软件下载安装1、Unity官网2、下载Unity Hub 二、修改Unity Hub配置1、设置Unity Hub中文语言2、修改默认存储目录 三、安装unity编辑器1、点击安装编辑器2、版本选择3、关于版本号4、安装模块选择5、等待下载完成自动安装即可6、追加unity和模块 四、许可证管理专…

SAP从入门到放弃系列之委外分包(Subcontracting)-Part1

以前写过一篇委外相关的文章,没有很详细的写。只是一个概念的概述ERP实施-委外业务-委外采购业务 最近看PA教材,遇到了这块内容,就再详细的整理一下SAP关于委外的理论知识。 文章目录 概述分包和物料需求计划 (MRP)委外分包订单分包委外业务…

vue前端报错 ERROR Error The project seems to require yarn but it‘s not installed

当我们项目启动的时候会报错 报错的信息:ERROR Error: The project seems to require yarn but it’s not installed. 解决的办法首先找到右边的文件夹,yarnlock 找打这个文件删除以后进行全局安装 npm install -g yarn

分体空调智能控制系统

空调是建筑中的用能大户,据统计,空调能耗占建筑总能耗的60%,空调节能作为建筑节能减排的重要组成部分,针对空调的监测和控制尤为重要。随着双碳战略的深入推进、数字化技术的快速发展、人们节能意识普遍增强,对空调用电…

Axure RP 8安装(内带安装包)

通过网盘分享的文件:Axure8.0.zip 链接: https://pan.baidu.com/s/195_qy2iiDIcYG4puAudScA 提取码: 6xt8 --来自百度网盘超级会员v1的分享 勾选I Agree 安装完成

如何在centos系统上挂载U盘

在CentOS上挂载NTFS格式的U盘,需要执行一系列步骤,包括识别U盘设备、安装必要的软件、创建挂载点,并最终挂载U盘。以下是在CentOS上挂载NTFS格式U盘的详细步骤: 一、准备工作 确认CentOS版本: 确保你的CentOS系统已经安装并正常运行。不同版本的CentOS在命令和工具方面可能…

闯关leetcode——3158. Find the XOR of Numbers Which Appear Twice

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/find-the-xor-of-numbers-which-appear-twice/description/ 内容 You are given an array nums, where each number in the array appears either once or twice. Return the bitwise XOR of all …

zabbix“专家坐诊”第270期问答

问题一 Q:请问,zabbix 6.0.26 是否支持在 Monitoring|Latest data页面仅通过Tags筛选主机?我尝试了下,发现无法筛选到。 A:这里是标记 要选主机正在旁边选。 Q:我只想筛选tag为xxx的主机,不限定…

Git使用经历

目录 1、先创建文件夹 2、仓库初始化 3、配置gitee用户名和密码 4、克隆指定仓库的中指定分支到本地仓库 5、查看当前所在分支、切换分支 6、查看状态,判断是否有修改 7、把更新的内容添加到缓存区 8、把缓存区的数据提交 9、把数据推送到远程仓库 10、把…

蓝牙协议——音乐启停控制

手机播放音乐 手机暂停音乐 耳机播放音乐 耳机暂停音乐

【Web】2024“国城杯”网络安全挑战大赛决赛题解(全)

最近在忙联通的安全准入测试,很少有时间看CTF了,今晚抽点时间回顾下上周线下的题(期末还没开始复习😢) 感觉做渗透测试一半的时间在和甲方掰扯&水垃圾洞,没啥惊喜感,还是CTF有意思 目录 Mountain ez_zhuawa 图…

信奥赛四种算法描述

#include <iostream> #include <iomanip> using namespace std;// 使用unsigned long long类型来尽量容纳较大的结果&#xff0c;不过实际上这个数值极其巨大&#xff0c;可能最终仍会溢出 // 更好的方式可以考虑使用高精度计算库&#xff08;如GMP等&#xff09;来…

12.19问答解析

概述 某中小型企业有四个部门&#xff0c;分别是市场部、行政部、研发部和工程部&#xff0c;请合理规划IP地址和VLAN&#xff0c;实现企业内部能够互联互通&#xff0c;同时要求市场部、行政部和工程部能够访问外网环境(要求使用OSPF协议)&#xff0c;研发部不能访问外网环境…

Docker部署Sentinel

一、简介 是什么&#xff1a;面向分布式、多语言异构化服务架构的流量治理组件 能干嘛&#xff1a;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性 官网地址&#xff1a;https://sentinelguard.io/zh-c…

LabVIEW如何学习FPGA开发

FPGA&#xff08;现场可编程门阵列&#xff09;开发因其高性能、低延迟的特点&#xff0c;在实时控制和高速数据处理领域具有重要地位。LabVIEW FPGA模块为开发者提供了一个图形化编程平台&#xff0c;降低了FPGA开发的门槛。本篇文章将详细介绍LabVIEW FPGA开发的学习路径&…

基于图注意力网络的两阶段图匹配点云配准方法

Two-stage graph matching point cloud registration method based on graph attention network— 基于图注意力网络的两阶段图匹配点云配准方法 从两阶段点云配准方法中找一些图匹配的一些灵感。文章提出了两阶段图匹配点云配准网络&#xff08;TSGM-Net&#xff09; TSGM-Ne…

U9多组织的退货单不能拉单找不到退货单

培训没有估好吧。参数是顾问亲自操刀去做的。当时事情又多&#xff0c;参加会议都是缺席的。财务做应收单拉单时&#xff0c;说有退货单找不到。也就是查询的条件&#xff08;逻辑&#xff09;不对嘛。U9的参数查询条件太多&#xff0c;逻辑复杂&#xff0c;一时真的分析不出来…

树莓派换源

查询自己版本&#xff1a; lsb_release -a bullseye可以理解为树莓派的系统代号&#xff08;10&#xff0c;11&#xff0c;12都不同&#xff0c;一定要看好自己系统是什么版本&#xff09; 查询架构 uname -a aarch64的地方就是代表系统架构的&#xff0c;我的是aarch64的架…

如何安全获取股票实时数据API并在服务器运行?

以下是安全获取股票实时数据 API 并在服务器运行的方法&#xff1a; 选择合适的券商或交易平台 评估自身需求&#xff1a;明确自己的交易策略、交易品种、交易频率等需求&#xff0c;以及对 股票api 的功能、性能、稳定性等方面的要求。调研券商或平台&#xff1a;了解不同券商…

MONI后台管理系统-swagger3(springdoc-openapi)集成

springdoc-openapi Java 库有助于使用 Spring Boot 项目自动生成 API 文档。springdoc-openapi 通过在运行时检查应用程序来根据 Spring 配置、类结构和各种注释推断 API 语义。 该库会自动生成 JSON/YAML 和 HTML 格式的页面文档。生成的文档可以使用swagger-api注释进行补充。…