在 Oracle 12c 使用 JSON 演 人 : John Jay King 下 地址 : 1
会 宗旨 理解 Oracle 12c 如何支持 JSON 在数据 中存 JSON 数据 熟悉 JSON 的条件和功能 使用 JSON 条件和功能 JSON 数据 在 JSON_TABLE 上使用 SQL JSON 数据 2
个人 介 John King King Training Resources 的股 Oracle Ace Oak Table Network 成 Oracle 和 IT 社 提供培, 有超 25 年的工作, 网址是 Oracle, ADF, SQL, Java, 和 PL/SQL( 有一些其他 ) 了如指掌的 技 家 AZORA, ODTUG, IOUG, 和 RMOUG 的成 3
何 JSON JSON (JavaScript Object Notation) 是一种独立于 言, 开放式的 (www.json.org) 在名 中 存文本 最初出 在 JavaScript, 在也出 于 : Java, R,.NET, PHP, Python, Node.js, 和 Oracle 中 常用于数据互 繁用于在 REST-style 网 服 中来回 数据 因大数据的持久性而广受 迎 4
12c (12.1.0.2) 和 JSON 12c patch-set 2 (12.1.0.2) 添加了 JSON JSON 文件以 VARCHAR2, CLOB, 或 BLOB 数据 型 行存 JSON 数据可以和 Oracle 有包括 SQL 和 Analytics 的所有特性一起工作 12c 支持 JSON data 基于路径的, 些数据存 在数据, JSON Path Language, 和 JSON Path Expressions 中 通 SQL/JSON, 在 SQL 中使用 JSON JSON 文件可以被索引 5
JSON-XML 相似性 JSON 就像 XML 格式一, 只是文本, 因此它是 行数据互 的一种有效媒介 JSON 和 XML 是 人 可 的 并且能 行 自描述 ( 有点 ) JSON 和 XML 是分 的 ( 数据集合安置在数据集内 ) JSON 和 XML 提供了 功能 ; 在 XML 的功能愈加成熟 6
JSON-XML 差异性 XML 比 冗, JSON 相 更精 JSON 没有 束, 而 XML 中 需要有 束 JSON 在 写速度方面更快 取 XML 文件 需要 遍 DOM JSON 不需要 与 AJAX 一起运行, 相 XML 来,JSO N 运行起来更加便捷快速 在 理数据之前,XML 文件必 行 法 7
JSON 句法 使用逗点隔开的名 / 来存 数据 字段名 / ( 由双引号括起来 ) 冒号 :, ( 由双引号括起的字符串, 不需要括起来的数, 布 trur/false/null 象包含在大括号内 { & } {"lastname":"king"} 数 使用方括号 [ & ] 和逗号 [ {"lastname": "King"}, {"lastname": "Manzo"} ] 8
XML 文件 <?xml version="1.0"?> <mybooks> <book> <name>learning XML</name> <author>eric T. Ray</author> <publisher>o'reilly</publisher> </book> <book> <name>xml Bible</name> <author>elliotte Rusty Harold</author> <publisher>idg Books</publisher> </book> <book> <name>xml by Example</name> <author>sean McGrath</author> </book> </mybooks> 9
JSON 文件 {"mybooks": [ {"book": { ]} }, {"book": { }, {"book": { } "name":"learning XML", "author":"eric T. Ray", "publisher":"o'reilly" } "name":"xml Bible", "author":"elliotte Rusty Harold", "publisher":"idg Books" } "name":"xml by Example", "author":"sean McGrath", "publisher":"prentice-hall" } 10
Oracle 作 JSON 数据存 JSON 文件使用 有的数据 型存 到数据 中 VARCHAR2, CLOB 和 BLOB JSON 字符模式 外部的 JSON 数据 源 ( 包括 HDFS 文件系 中的那些 源 ) 可以通 外部表来 取 基于 JSON_TABLE 的相关, 使用 SQL 来 取 JSON 数据 Oracle JSON 文件可以被索引 ; JSON 路径可以使用功能索引 11
JSON SQL JSON 内容可以从 SQL 中 取, 而且可以 JSON 来使用 : JSON 条件运算符 JSON 功能 JSON 运算符和功能函数使用 JSON Path 言来引 JSON 象 12
JSON 运算符 JSON 内容可以 新的条件运算符从 SQL 中 IS JSON JSON, 通常是在 CHECK 限制和 WHERE 中 (IS / IS NOT) JSON_EXISTS 如果 JSON 路径在文件中存在 True JSON_TEXTCONTAINS 如果在 JSON 的属性 中 文本字符串 True ( 使用 Oracle 文本 ) 13
JSON 功能 JSON 内容也可以通 新的功能来 取 JSON_VALUE 用来从 JSON 文件中 量 JSON_QUERY 用来 所有或者部分 JSON 文件内容 JSON_TABLE 用来 JSON 文件并且 建相关格式的列 14
IS JSON IS NOT JSON 如果特定的表达是一个有效的 JSON 文件, 那么 IS JSON 会返回 TRUE **expr** IS JSON IS NOT JSON FORMAT JSON STRICT LAX WITH WITHOUT UNIQUE KEYS 如果是有效的 JSON, IS true, 如果不是 JSON, IS NOT true FORMAT JSON ( 只是 足 BLOB 数据的需要 ) STRICT / LAX 格 如果需要主, WITH / WITHOUT 15
JSON Check 有 束嘛 create table deptj (id raw(16) not null, ); dept_info clob constraint deptjson check (dept_info is json) create table deptj (id raw(16) not null, dept_info clob constraint deptjson check (dept_info is json strict) ); 16
IS JSON in WHERE select id,dept_info from deptj where dept_info is json select id,dept_info from deptj where dept_info is json strict; select id,dept_info from deptj where dept_info is json format json strict; 17
JSON 和 DML insert into deptj values (sys_guid(), '{"departments":{ "DEPTNO": 10, "DNAME": "ACCOUNTING", "LOC": "NEW YORK", "deptemps": [ { "EMPNO": 7782, "ENAME": "CLARK", "JOB": "MANAGER", "MGR": 7839, "HIREDATE": "09-JUN-81", "pay":{ "SAL": 2450, "DEPTNO": "10" }, /* more */ "COMM": null}, 18
的 JSON Query select dept_info from deptj; DEPT_INFO --------------------------------------------- {"departments":{ "DEPTNO": 10, "DNAME": "ACCOUNTING", "LOC": "NEW YORK", "deptemps": [ { "EMPNO": 7782, "ENAME": "CLARK", **** more **** 19
JSON 路径 JSON 文件中的 $.jsonpath Identifies 路径 $. ( 需要的 ) Jsonpath ( 如果不需要整个文件的返回, 那么就指定 找 JSON 文件中的部分来 行搜 ) 由 JSON_QUERY, JSON_VALUE, JSON_TABLE, JSON_EXISTS, JSON_TEXTCONTAINS 使用的 JSON path 20
JSON_VALUE JSON_VALUE 在 JSON 文件中 了一个, 并将它作 VARCHAR2 或者 NUMBER 返回 SQL JSON_VALUE (expr expr FORMAT JSON, '$.jsonpath RETURNING VARCHAR2(n) NUMBER(n,n) ERROR NULL DEFAULT xxx ON ERROR ) 21
使用 JSON_VALUE select json_value(dept_info, '$.departments.dname') from deptj; DNAME ----------------- ACCOUNTING RESEARCH SALES OPERATIONS 22
JSON_VALUE JSON_VALUE 从 JSON 数据中返回 量 select json_value(dept_info, '$.departments.dname') from deptj; select json_value(dept_info, '$.departments.deptemps[0].ename') from deptj; select dept_info from deptj where json_value(dept_info, '$[0].departments.DEPTNO') = '10' 23
JSON_TABLE JSON_TABLE 把 JSON 数据匹配到相关的行和列中 JSON_TABLE ( expr expr FORMAT JSON,'$.jsonpath ERROR NULL DEFAULT xxx ON ERROR COLUMNS ( colname1 datatype EXISTS PATH '$.jsonpath ERROR NULL DEFAULT xxx ON ERROR, colname2 datatype FORMAT JSON jsonquerywrapper PATH '$.jsonpath ERROR NULL DEFAULT xxx ON ERROR, colname3 datatype PATH '$.jsonpath ERROR NULL DEFAULT xxx ON ERROR, NESTED PATH '$.jsonpath' COLUMNS (...), colname4 FOR ORDINALITY ) 24
使用 JSON_TABLE select dname,ename,job,sal from deptj, json_table(dept_info,'$.departments' )); columns (dname varchar2(15) path '$.DNAME',nested path '$.deptemps[*]' columns (ename varchar2(20) path '$.ENAME',job varchar2(20) path '$.JOB' ),nested path '$.pay' columns (sal number path '$.SAL') DNAME ENAME JOB SAL ------------ ------- -------- ---------- ACCOUNTING CLARK MANAGER 2450 ACCOUNTING KING PRESIDENT 5000 **** more **** 25
束演 Oracle 12c 及 的 JSON 行了支持, 并非常有用 相信很快 JSON 就会被得到 用 JSON 是 : 与 AJAX 相互的一种最常 的机制 成 网 服 数据最常 的机制 ( 尤其是基于服 的 REST/HTTP API ) 几种 大数据 数据存 的基石 花 来了解 JSON, JSON 句法, 和 Oracle 的 26
RMOUG Training Days 2016 2016 年 2 月 9-11 日 ( 周二 - 周四 ) 丹佛会展中心 27
COLLABORATE 16 IOUG 2016 4 10-14 Mandalay Bay Las Vegas, NV 28
29
在 Oracle 12c 中使用 JSON 完成会 估 系作者 : John King King Training Resources P. O. Box 1780 Scottsdale, AZ 85252 USA 1.800.252.0652-1.303.798.5727 Email: john@kingtraining.com 感 收听 可在 网站 看今天的幻灯片和例子 : 30
束 31