JSON 系列之2:JSON简单查询

本文为Oracle数据库JSON学习系列的第2篇,讲述如何对存储在数据库中的JSON文档进行简单的查询。

创建测试表,插入2条数据:

sql 复制代码
DROP TABLE colortab PURGE;

CREATE TABLE colortab (
    id    NUMBER,
    color VARCHAR2(4000),
    CONSTRAINT ensure_json CHECK ( color IS JSON )
);

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

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

COMMIT;

查询使用dot notation即可,非常直观:

sql 复制代码
SQL> SELECT c.color.name from colorTab c;

NAME      
----------
black
orange red

SQL> SELECT c.color.rgb from colorTab c;

RGB       
----------
[0,0,0]
[255,69,0]

SQL> SELECT c.color.rgb[0] from colorTab c;

RGB       
----------
0
255

可以看到,对于标量和数组都可以查询,数组的第一个元素索引为0。

注意,这个别名是必须的,否则报错:

sql 复制代码
SQL> SELECT color.name from colorTab;

在行: 3 上开始执行命令时出错 -
SELECT color.name from colorTab
错误位于命令行: 3 列: 8
错误报告 -
SQL 错误: ORA-00904: "COLOR"."NAME": 标识符无效

https://docs.oracle.com/error-help/db/ora-00904/00904. 00000 -  "%s: invalid identifier"
*Cause:    The identifier or column name entered was invalid.
*Action:   Ensure the following

More Details :
https://docs.oracle.com/error-help/db/ora-00904/

对于表中一个不存在的列,SELECT会报错;但对于JSON文档中一个不存在的域,则不会报错,返回null。这正是 flexible schema 所需要的。

sql 复制代码
SQL> SELECT c.color.nofield from colorTab c;

NOFIELD   
----------



已选择 2 行。

如果你希望报错,可以修改初始化参数json_behavior,默认值是ON_ERROR:NULL

sql 复制代码
SQL> alter session set json_behavior='on_error:error';

Session已变更。

SQL> SELECT c.color.nofield from colorTab c;

在行: 5 上开始执行命令时出错 -
SELECT c.color.nofield from colorTab c
错误位于命令行: 5 列: 29
错误报告 -
SQL 错误: ORA-40462: JSON 路径 '$.nofield' 的求值结果为无值。

https://docs.oracle.com/error-help/db/ora-40462/40462. 00000 -  "JSON path '%s' evaluated to no value."
*Cause:    The specified JavaScript Object Notation (JSON) path expression
           did not select a value.
*Action:   Correct the JSON path expression.

More Details :
https://docs.oracle.com/error-help/db/ora-40462/

SQL> alter session reset json_behavior;

Session已变更。

参考

相关推荐
XDHCOM16 小时前
ORA-32484重复列名错误,ORACLE数据库CYCLE子句故障修复与远程处理方案
数据库·oracle
一博一言17 小时前
Oracle高版本Version_Count问题处理排查
oracle·dba
Java成神之路-17 小时前
SpringMVC 响应实战指南:页面、文本、JSON 返回全流程(Spring系列13)
java·spring·json
LilySesy19 小时前
【与AI+】英语day4——数据库与性能优化
数据库·oracle·性能优化·sap·abap·自动翻译
余佬学数据库19 小时前
Error 57 initializing SQL*Plus Error loading message shared library
oracle
我命由我1234520 小时前
在 React 项目中,可以执行 npm start 命令,但是,无法执行 npm build 命令
前端·javascript·vue.js·react.js·前端框架·json·ecmascript
Yana.nice20 小时前
MySQL 事务的四大特性(ACID)
数据库·mysql·oracle
小小程序员.¥21 小时前
oracle--视图、序列、索引
服务器·数据库·oracle
带刺的坐椅21 小时前
RFC 9535:JSONPath 的标准化之路
java·json·jsonpath·snack4·rfc9535
zzh08121 小时前
PG数据库日常应用
数据库·oracle