介绍
JSON格式在web时代借助js的数据交互火了起来,因此也就有了如mongodb这样的nosql数据库,用来存储json格式的数据库。
但模式融合一定是未来趋势,因为每一种数据库模式都有特定的使用场景,一个复杂的应用很难使用一种模式解决数据处理。
因此,oracle数据库除了提供如Oracle NoSQL数据库和Oracle Berkeley DB这样的NoSQL数据库外,还在传统数据库中提供了JSON的支持。
和XML数据可以类似的方式在Oracle数据库中使用,无需定义数据的架构。Oracle数据库通过关系数据库功能(包括事务,索引,声明性查询和视图)来支持JSON。
JSON数据通常存储在NoSQL数据库中,例如Oracle NoSQL数据库和Oracle Berkeley DB。这些允许存储和检索不基于任何模式的数据,但是它们不提供关系数据库的严格一致性模型。
Oracle Database对JSON的本机支持消除了此类变通办法。它提供了与JSON一起使用的关系数据库功能的所有优点,包括事务,索引,声明性查询和视图。
Oracle数据库查询是声明性的。您可以将JSON数据与关系数据结合在一起。而且,您可以通过关系投影JSON数据,使其可用于关系流程和工具。您还可以从数据库内部查询存储在数据库外部的外部表中的JSON数据。
JSON数据是使用SQL数据类型储存在Oracle数据库VARCHAR2,CLOB和BLOB。Oracle建议始终使用is_json检查约束来确保列值是有效的JSON实例。
在数据库中的JSON数据是文本,但是文本可使用的数据类型被存储BLOB为,以及VARCHAR2或CLOB。如果可能,Oracle建议您使用BLOB存储。特别是,这样做避免了任何字符集转换的需要。
用法
创建表
CREATE TABLE student
(id RAW (16) NOT NULL,
create_time TIMESTAMP WITH TIME ZONE,
info CLOB
CONSTRAINT student_json CHECK (info IS JSON));
复制
插入数据
$ INSERT INTO student
VALUES
(SYS_GUID(),
SYSTIMESTAMP,
'{
"name": "张三",
"age": 22,
"hobby": ["篮球", "游泳", "象棋"],
"tel": "13893665508",
"college": {
"name": "北京大学",
"major": "计算机应用"
}
}');
复制
整个字段查询
查询json中的值,数组,对象
查询json中数组中的单个值
查询条件中使用json中的条件
select * from student a where a.info.name='张三'
查询条件中使用json中的条件
复制
可以在json字段上创建索引
CREATE INDEX idx_info
ON student (json_value(info, '$.name'));
复制
说明
只能整体对存入的json进行修改更新;
没有很好的函数支持对现有常规表返回json格式的数据,需要写存储过程实现;
功能虽然还不够强大,但足以支撑规则数据查询后直接以json数据进行展示的应用