Oracle BLOB 是一个二进制大对象数据类型,用于存储大量的二进制数据,如图像、音频、视频等。下面是与 BLOB 相关的一些函数、索引和操作。
BLOB 函数
DBMS_LOB: 提供了一组用于操作 BLOB、CLOB 和 NCLOB 数据类型的程序包。
主要函数包括:
- DBMS_LOB.OPEN: 打开 LOB
- DBMS_LOB.CLOSE: 关闭 LOB
- DBMS_LOB.READ: 读取 LOB 数据
- DBMS_LOB.WRITE: 写入 LOB 数据
- DBMS_LOB.GETLENGTH: 获取 LOB 长度
- DBMS_LOB.APPEND: 将数据追加到 LOB
- DBMS_LOB.COPY: 复制 LOB 数据
- DBMS_LOB.TRIM: 裁剪 LOB 数据
- DBMS_LOB.COMPARE: 比较两个 LOB 数据
- DBMS_LOB.INSTR: 搜索 LOB 中的模式
- DBMS_LOB.SUBSTR: 提取 LOB 的子串
UTL_RAW: 提供了一组用于操作 RAW 数据类型的程序包。
主要函数包括:
- UTL_RAW.CAST_TO_RAW: 将输入转换为 RAW 类型
- UTL_RAW.CAST_TO_VARCHAR2: 将 RAW 类型转换为 VARCHAR2 类型
- UTL_RAW.LENGTH: 返回 RAW 数据的长度
- UTL_RAW.BIT_COMPLEMENT: 返回 RAW 数据的位补
- UTL_RAW.BIT_AND: 返回两个 RAW 数据的位与运算结果
- UTL_RAW.BIT_OR: 返回两个 RAW 数据的位或运算结果
- UTL_RAW.BIT_XOR: 返回两个 RAW 数据的位异或运算结果
- UTL_RAW.CONCAT: 连接两个 RAW 数据
- UTL_RAW.SUBSTR: 从 RAW 数据中提取子串
- UTL_RAW.TRANSLATE: 根据给定的转换表进行 RAW 数据转换
- UTL_RAW.COMPARE: 比较两个 RAW 数据
索引
使用 BLOB 列作为索引的基础:
BLOB 列可以与 Oracle Text 一起使用,创建基于 BLOB 列内容的全文索引。
可以使用 DBMS_LOB.SUBSTR 函数和函数索引从 BLOB 列提取特定的子串,并在查询中使用它们。
示例:使用 emp 表中的 photo 列(BLOB 类型)作为示例。
使用 DBMS_LOB.READ 从 BLOB 中读取数据:
DECLARE v_buffer RAW(32767); BEGIN SELECT photo INTO v_buffer FROM emp WHERE empno = 100; DBMS_LOB.READ(v_buffer, v_amount, v_offset, v_buffer); END;
复制
使用 DBMS_LOB.WRITE 将数据写入 BLOB
DECLARE v_buffer RAW(32767); BEGIN SELECT photo INTO v_buffer FROM emp WHERE empno = 100; DBMS_LOB.WRITE(v_buffer, v_amount, v_offset, v_buffer); UPDATE emp SET photo = v_buffer WHERE empno = 100; END;
复制
获取 BLOB 的长度:
SELECT LENGTH(photo) FROM emp WHERE empno = 100; 使用 UTL_RAW.CAST_TO_VARCHAR2 将 BLOB 转换为 VARCHAR2
复制
DECLARE v_blob BLOB; v_varchar2 VARCHAR2(32767); BEGIN SELECT photo INTO v_blob FROM emp WHERE empno = 100; v_varchar2 := UTL_RAW.CAST_TO_VARCHAR2(v_blob); END;
复制
创建一个函数索引:
-- 创建一个提取员工照片中某个属性的函数 CREATE OR REPLACE FUNCTION get_photo_attribute(p_photo BLOB) RETURN NUMBER DETERMINISTIC IS BEGIN -- 在此处实现提取属性的逻辑 RETURN ...; END; /
复制
– 基于 get_photo_attribute 函数创建一个函数索引
CREATE INDEX emp_photo_attribute_idx ON emp(get_photo_attribute(photo));
json 函数
Oracle 19c提供了一系列的JSON函数,以方便地处理JSON数据。以下是一些常用的JSON函数,结合EMP表的示例说明:
JSON_VALUE: 提取JSON数据中的标量值
SELECT JSON_VALUE(emp_json, '$.name') AS emp_name FROM (SELECT '{"name": "John", "age": 30, "city": "New York"}' AS emp_json FROM DUAL) emp;
复制
JSON_QUERY: 提取JSON数据中的对象或数组
SELECT JSON_QUERY(emp_json, '$.skills') AS emp_skills FROM (SELECT '{"name": "John", "age": 30, "skills": ["Java", "SQL"]}' AS emp_json FROM DUAL) emp;
复制
JSON_TABLE: 将JSON数据转换为关系表
SELECT emp_name, emp_age, emp_city FROM (SELECT '{"name": "John", "age": 30, "city": "New York"}' AS emp_json FROM DUAL) emp, JSON_TABLE(emp_json, '$' COLUMNS (emp_name VARCHAR2(50) PATH '$.name', emp_age NUMBER PATH '$.age', emp_city VARCHAR2(50) PATH '$.city'));
复制
JSON_EXISTS: 检查JSON数据中是否存在指定的路径
SELECT CASE WHEN JSON_EXISTS(emp_json, '$.city') THEN '存在' ELSE '不存在' END AS city_exists FROM (SELECT '{"name": "John", "age": 30, "city": "New York"}' AS emp_json FROM DUAL) emp;
复制
JSON_OBJECT: 根据键值对生成JSON对象
SELECT JSON_OBJECT('name' VALUE e.ename, 'job' VALUE e.job) AS emp_json FROM emp e WHERE e.empno = 7369;
复制
JSON_ARRAY: 根据查询结果生成JSON数组
SELECT JSON_ARRAYAGG(JSON_OBJECT('name' VALUE e.ename, 'job' VALUE e.job)) AS emp_json_array FROM emp e WHERE e.deptno = 10;
复制
JSON_OBJECTAGG: 聚合多个JSON对象
SELECT deptno, JSON_OBJECTAGG(ename, job) AS emp_data FROM emp GROUP BY deptno;
复制
JSON_ARRAYAGG: 聚合多个JSON数组
SELECT deptno, JSON_ARRAYAGG(JSON_OBJECT('name' VALUE ename, 'job' VALUE job)) AS emp_data FROM emp GROUP BY deptno;
复制
JSON_SERIALIZE: 将JSON数据转换为字符串或CLOB。
SELECT JSON_SERIALIZE(emp_json) AS emp_json_str FROM (SELECT JSON_OBJECT('name' VALUE e.ename, 'job' VALUE e.job) AS emp_json FROM emp e WHERE e.empno = 7369) emp;
复制
JSON_MERGEPATCH: 合并两个JSON文档,根据RFC 7396定义的JSON Merge Patch算法
SELECT JSON_MERGEPATCH(base_json, patch_json) AS merged_json FROM (SELECT '{"name": "John", "age": 30, "city": "New York"}' AS base_json, '{"age": 31, "city": null}' AS patch_json FROM DUAL) emp;
复制
JSON_EQUAL: 检查两个JSON文档是否相等
SELECT CASE WHEN JSON_EQUAL(json1, json2) THEN '相等' ELSE '不相等' END AS json_comparison FROM (SELECT '{"name": "John", "age": 30, "city": "New York"}' AS json1, '{"city": "New York", "name": "John", "age": 30}' AS json2 FROM DUAL) emp;
复制
JSON_TEXTCONTAINS2: 检查JSON数据中是否包含指定的文本
SELECT ename FROM emp e WHERE JSON_TEXTCONTAINS2(e.emp_json, '$.skills[*]', 'SQL');
复制
JSON_KEYS: 获取JSON对象的所有键。
SELECT JSON_KEYS(emp_json) AS emp_keys FROM (SELECT '{"name": "John", "age": 30, "city": "New York"}' AS emp_json FROM DUAL) emp;
复制
JSON_LENGTH: 获取JSON对象或数组的长度
SELECT JSON_LENGTH(emp_json, '$.skills') AS skill_count FROM (SELECT '{"name": "John", "age": 30, "skills": ["Java", "SQL"]}' AS emp_json FROM DUAL) emp;
复制
JSON_DATAGUIDE: 自动生成JSON数据指南,以描述JSON数据的结构
SELECT JSON_DATAGUIDE(emp_json) AS data_guide FROM (SELECT '{"name": "John", "age": 30, "city": "New York"}' AS emp_json FROM DUAL) emp;
复制
JSON_REMOVE: 删除JSON数据中指定的属性
SELECT JSON_REMOVE(emp_json, '$.city') AS emp_without_city FROM (SELECT '{"name": "John", "age": 30, "city": "New York"}' AS emp_json FROM DUAL) emp;
复制
JSON_INSERT: 在JSON数据中插入新的属性
SELECT JSON_INSERT(emp_json, '$.country', 'USA') AS emp_with_country FROM (SELECT '{"name": "John", "age": 30, "city": "New York"}' AS emp_json FROM DUAL) emp;
复制
JSON_REPLACE: 替换JSON数据中的属性
SELECT JSON_REPLACE(emp_json, '$.city', 'San Francisco') AS emp_updated_city FROM (SELECT '{"name": "John", "age": 30, "city": "New York"}' AS emp_json FROM DUAL) emp;
复制
最后修改时间:2023-03-22 11:44:24
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
2025年3月中国数据库排行榜:PolarDB夺魁傲群雄,GoldenDB晋位入三强
墨天轮编辑部
1650次阅读
2025-03-11 17:13:58
【专家观点】罗敏:从理论到真实SQL,感受DeepSeek如何做性能优化
墨天轮编辑部
1239次阅读
2025-03-06 16:45:38
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1219次阅读
2025-03-13 11:40:53
01. HarmonyOS Next应用开发实践与技术解析
若城
1177次阅读
2025-03-04 21:06:20
DeepSeek R1助力,腾讯AI代码助手解锁音乐创作新
若城
1161次阅读
2025-03-05 09:05:00
03 HarmonyOS Next仪表盘案例详解(二):进阶篇
若城
1159次阅读
2025-03-04 21:08:36
05 HarmonyOS NEXT高效编程秘籍:Arkts函数调用与声明优化深度解析
若城
1152次阅读
2025-03-04 22:46:06
04 高效HarmonyOS NEXT编程:ArkTS数据结构优化与属性访问最佳实践
若城
1141次阅读
2025-03-04 21:09:35
02 HarmonyOS Next仪表盘案例详解(一):基础篇
若城
1138次阅读
2025-03-04 21:07:43
06 HarmonyOS Next性能优化之LazyForEach 列表渲染基础与实现详解 (一)
若城
1132次阅读
2025-03-05 21:09:40
TA的专栏
热门文章
tcp keepalive 保活机制相关参数和LightDB长连接中断问题
2023-03-15 3886浏览
硬件知识之PCIe(一)
2022-11-09 3378浏览
AMD Zen 3 Ryzen 深入评测:5950X、5900X、5800X 和 5600X 测试
2023-07-07 2860浏览
ERROR: ORA-24345: A Truncation or null fetch error occurred (DBD SUCCESS_WITH_INFO: OCIStmtFetch
2023-05-24 2462浏览
Oracle PL/SQL 常见的存储过程异常处理DBMS_UTILITY、SQLCODE、SQLERRM
2023-05-05 1566浏览
目录