1 row created.
1 row created.
1 row created.
4.2 JSON函数实战案例
示例1:使用JSON_VALUE提取标量值
— 使用JSON_VALUE提取标量值
SELECT
customer_id,
JSON_VALUE(customer_info, ‘$.name’) AS name,
JSON_VALUE(customer_info, ‘$.age’) AS age,
JSON_VALUE(customer_info, ‘$.address.city’) AS city
FROM fgedu_customers_json;
SELECT
customer_id,
JSON_VALUE(customer_info, ‘$.name’) AS name,
JSON_VALUE(customer_info, ‘$.age’) AS age,
JSON_VALUE(customer_info, ‘$.address.city’) AS city
FROM fgedu_customers_json;
CUSTOMER_ID NAME AGE CITY
———– ———- — ———-
1 风哥1号 30 北京
2 风哥2号 25 上海
———– ———- — ———-
1 风哥1号 30 北京
2 风哥2号 25 上海
示例2:使用JSON_QUERY提取JSON片段
— 使用JSON_QUERY提取JSON片段
SELECT
customer_id,
JSON_QUERY(customer_info, ‘$.address’) AS address,
JSON_QUERY(customer_info, ‘$.phones’) AS phones
FROM fgedu_customers_json;
SELECT
customer_id,
JSON_QUERY(customer_info, ‘$.address’) AS address,
JSON_QUERY(customer_info, ‘$.phones’) AS phones
FROM fgedu_customers_json;
CUSTOMER_ID ADDRESS PHONES
———– ——————————— —————————
1 {“city”:”北京”,”district”:”朝阳区”} [“13812345678″,”13987654321”]
2 {“city”:”上海”,”district”:”浦东新区”} [“13712345678”]
———– ——————————— —————————
1 {“city”:”北京”,”district”:”朝阳区”} [“13812345678″,”13987654321”]
2 {“city”:”上海”,”district”:”浦东新区”} [“13712345678”]
示例3:使用JSON_TABLE将JSON转换为关系表
— 使用JSON_TABLE将JSON转换为关系表
SELECT
c.customer_id,
c.name,
p.phone
FROM fgedu_customers_json,
JSON_TABLE(
customer_info,
‘$’
COLUMNS (
name VARCHAR2(50) PATH ‘$.name’,
NESTED PATH ‘$.phones[*]’ COLUMNS (
phone VARCHAR2(20) PATH ‘$’
)
)
) p;
SELECT
c.customer_id,
c.name,
p.phone
FROM fgedu_customers_json,
JSON_TABLE(
customer_info,
‘$’
COLUMNS (
name VARCHAR2(50) PATH ‘$.name’,
NESTED PATH ‘$.phones[*]’ COLUMNS (
phone VARCHAR2(20) PATH ‘$’
)
)
) p;
CUSTOMER_ID NAME PHONE
———– ———- ——————–
1 风哥1号 13812345678
1 风哥1号 13987654321
2 风哥2号 13712345678
———– ———- ——————–
1 风哥1号 13812345678
1 风哥1号 13987654321
2 风哥2号 13712345678
示例4:使用JSON_OBJECT和JSON_ARRAY创建JSON
— 使用JSON_OBJECT和JSON_ARRAY创建JSON
SELECT
JSON_OBJECT(
’employee_id’ VALUE employee_id,
‘name’ VALUE first_name || ‘ ‘ || last_name,
‘job’ VALUE job_id,
‘salary’ VALUE salary,
‘departments’ VALUE JSON_ARRAY(
department_id
)
) AS employee_json
FROM employees
WHERE employee_id <= 102;
SELECT
JSON_OBJECT(
’employee_id’ VALUE employee_id,
‘name’ VALUE first_name || ‘ ‘ || last_name,
‘job’ VALUE job_id,
‘salary’ VALUE salary,
‘departments’ VALUE JSON_ARRAY(
department_id
)
) AS employee_json
FROM employees
WHERE employee_id <= 102;
EMPLOYEE_JSON
——————————————————————————–
{“employee_id”:100,”name”:”Steven King”,”job”:”AD_PRES”,”salary”:24000,”departments”:[90]}
{“employee_id”:101,”name”:”Neena Kochhar”,”job”:”AD_VP”,”salary”:17000,”departments”:[90]}
{“employee_id”:102,”name”:”Lex De Haan”,”job”:”AD_VP”,”salary”:17000,”departments”:[90]}
——————————————————————————–
{“employee_id”:100,”name”:”Steven King”,”job”:”AD_PRES”,”salary”:24000,”departments”:[90]}
{“employee_id”:101,”name”:”Neena Kochhar”,”job”:”AD_VP”,”salary”:17000,”departments”:[90]}
{“employee_id”:102,”name”:”Lex De Haan”,”job”:”AD_VP”,”salary”:17000,”departments”:[90]}
4.3 JSON查询与索引
示例1:创建JSON索引
— 创建JSON搜索索引
CREATE SEARCH INDEX fgedu_customers_json_idx ON fgedu_customers_json(customer_info) FOR JSON;– 创建JSON值索引
CREATE INDEX fgedu_customers_name_idx ON fgedu_customers_json(JSON_VALUE(customer_info, ‘$.name’));
CREATE SEARCH INDEX fgedu_customers_json_idx ON fgedu_customers_json(customer_info) FOR JSON;– 创建JSON值索引
CREATE INDEX fgedu_customers_name_idx ON fgedu_customers_json(JSON_VALUE(customer_info, ‘$.name’));
Index created.
Index created.
Index created.
示例2:使用JSON_EXISTS进行条件查询
— 使用JSON_EXISTS进行条件查询
SELECT
customer_id,
JSON_VALUE(customer_info, ‘$.name’) AS name
FROM fgedu_customers_json
WHERE JSON_EXISTS(customer_info, ‘$.phones[*] ? (@ == “13812345678”)’);
SELECT
customer_id,
JSON_VALUE(customer_info, ‘$.name’) AS name
FROM fgedu_customers_json
WHERE JSON_EXISTS(customer_info, ‘$.phones[*] ? (@ == “13812345678”)’);
CUSTOMER_ID NAME
———– ———-
1 风哥1号
———– ———-
1 风哥1号
4.4 JSON与关系数据集成
示例1:JSON与关系数据的集成
— 创建订单表
CREATE TABLE fgedu_orders_json (
order_id NUMBER(6),
order_date DATE,
customer_id NUMBER(6),
order_items JSON,
total_amount NUMBER(10,2)
);– 插入订单数据
INSERT INTO fgedu_orders_json VALUES (
1,
SYSDATE,
1,
‘{“items”: [{“product_id”: “A001”, “quantity”: 2, “price”: 100.00}, {“product_id”: “B002”, “quantity”: 1, “price”: 200.00}]}’,
400.00
);– 查询订单和客户信息
SELECT
o.order_id,
o.order_date,
JSON_VALUE(c.customer_info, ‘$.name’) AS customer_name,
JSON_VALUE(c.customer_info, ‘$.address.city’) AS city,
o.total_amount
FROM fgedu_orders_json o
JOIN fgedu_customers_json c ON o.customer_id = c.customer_id;
CREATE TABLE fgedu_orders_json (
order_id NUMBER(6),
order_date DATE,
customer_id NUMBER(6),
order_items JSON,
total_amount NUMBER(10,2)
);– 插入订单数据
INSERT INTO fgedu_orders_json VALUES (
1,
SYSDATE,
1,
‘{“items”: [{“product_id”: “A001”, “quantity”: 2, “price”: 100.00}, {“product_id”: “B002”, “quantity”: 1, “price”: 200.00}]}’,
400.00
);– 查询订单和客户信息
SELECT
o.order_id,
o.order_date,
JSON_VALUE(c.customer_info, ‘$.name’) AS customer_name,
JSON_VALUE(c.customer_info, ‘$.address.city’) AS city,
o.total_amount
FROM fgedu_orders_json o
JOIN fgedu_customers_json c ON o.customer_id = c.customer_id;
ORDER_ID ORDER_DATE CUSTOMER_NAME CITY TOTAL_AMOUNT
———– ———- ————- ———- ————
1 29-MAR-26 风哥1号 北京 400.00
———– ———- ————- ———- ————
1 29-MAR-26 风哥1号 北京 400.00
Part05-风哥经验总结与分享
5.1 JSON操作使用技巧
- 选择合适的存储方式:根据JSON文档的大小和查询模式选择合适的存储方式
- 使用JSON_TABLE进行复杂查询:对于复杂的JSON查询,JSON_TABLE比JSON_VALUE更灵活
- 创建适当的JSON索引:为频繁查询的JSON路径创建索引
- 使用绑定变量:在JSON查询中使用绑定变量提高性能
- 避免过度使用JSON:对于结构化数据,使用关系表可能更高效
5.2 常见错误与解决方案
- JSON语法错误:确保JSON数据格式正确,使用JSON验证功能
- 性能问题:对于大型JSON文档,考虑使用分片存储和索引
- 内存不足:处理大型JSON文档时可能会遇到内存不足的问题,需要调整内存参数
- 索引失效:确保JSON索引被正确使用,避免在JSON函数中使用表达式
- 版本兼容性:不同Oracle版本的JSON功能可能有所不同,注意版本兼容性
5.3 性能调优建议
- 使用JSON搜索索引:为JSON数据创建搜索索引提高查询性能
- 优化JSON路径表达式:编写高效的JSON路径表达式,避免复杂的路径查询
- 使用并行执行:对于大型JSON处理,考虑使用并行执行
- 调整内存参数:为JSON处理调整适当的内存参数
- 监控JSON性能:使用Oracle的性能监控工具监控JSON操作的性能
风哥提示:
本文档风哥主要介绍Oracle SQL中的JSON操作功能,包括JSON数据类型、JSON函数和JSON查询,由风哥教程参考Oracle官方文档Development内容编写,适合DBA人员和开发人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
学习交流加群风哥QQ113257174
生产环境建议:请根据实际情况调整配置和参数,确保生产环境的安全性和稳定性。
风哥提示:更多学习教程公众号风哥教程itpux_com
更多视频教程www.fgedu.net.cn
学习交流加群风哥微信: itpux-com
from oracle:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
