Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


DBMS_LOB系统包

📄字数 1.6K
👁️阅读量 加载中...

一、概述

DBMS_LOB系统包是用于支持大对象(LOB,Large Object)数据类型的系统包。它允许用户在PL/SQL中对BLOB(二进制大对象)和CLOB(字符大对象)等字段进行读取操作。该包适用于处理大型文本、图像、音频、PDF等非结构化数据。

该系统包中提供了以下接口:

包体函数名简要描述
GETLENGTH获取大对象长度
READ读取大对象数据

典型应用场景,如:

  • 检查大对象字段内容大小,使用GETLENGTH获取BLOB/CLOB实际存储长度
  • 从CLOB中读取正文段落,使用READ从指定位置读取部分文本
  • 读取BLOB前几位做内容校验,比如读取文件头判断是否为图片、PDF等

二、GETLENGTH

2.1 功能描述

该方法有2种重载方式,分别对应计算BLOB/CLOB数据类型的长度

2.2 方法声明

  • 重载形式一:计算BLOB数据的长度

    sql
    FUNCTION  GETLENGTH(
        lob_loc     BLOB
        ) RETURN    INTEGER
  • 重载形式二:计算CLOB数据的长度

    sql
    FUNCTION  GETLENGTH(
        lob_loc     CLOB
        ) RETURN    INTEGER

2.3 参数说明

参数名类型取值范围是否可选描述
lob_locBLOB/CLOB数据源

2.4 示例

sql
SQL> CREATE TABLE table_lob(id INT,cb BLOB,cc CLOB);
SQL> INSERT INTO table_lob VALUES(1,UTL_RAW.CAST_TO_RAW('BLOB数据'),'CLOB数据');  

-- 计算BLOB/CLOB数据的长度
SQL> SELECT DBMS_LOB.GETLENGTH(cb) len_blob,DBMS_LOB.GETLENGTH(cc) len_clob FROM table_lob WHERE id=1;
+----------+----------+
| LEN_BLOB | LEN_CLOB |
+----------+----------+
| 10       | 6        |
+----------+----------+

2.5 场景应用

  • 场景一:在数据库中,有些LOB字段内容非常大,可能拖慢查询性能,可以通过该方法计算数据量,优化处理方式
  • 场景二:数据全备时,LOB字段可能导致备份慢或备份包异常大,以通过该方法计算LOB数据量,分段或分期备份

三、READ

3.1 功能描述

该方法有2种重载方式,分别对应读取BLOB/CLOB数据类型的内容

3.2 方法声明

  • 重载形式一:读取BLOB大对象数据

    sql
    PROCEDURE READ(
        lob_loc BLOB,
        amount  INTEGER,
        offset  INTEGER, 
        out_buff OUT VARCHAR
        );
  • 重载形式二:读取CLOB大对象数据

    sql
    PROCEDURE READ(
        lob_loc CLOB,
        amount INTEGER,
        offset INTEGER, 
        out_buff OUT VARCHAR
        );

3.3 参数说明

参数名类型取值范围是否可选描述
lob_locBLOB/CLOB要读取的大对象
amountINTEGER读取的长度
offsetINTEGER偏移量
out_buffVARCHAROUT型参数,读取内容返回给该参数

提示

1、偏移量为1时表示起始位置
2、当读取长度大于大对象实际长度时,取大对象实际长度进行读取

3.4 示例

sql

-- 创建用于读取CLOB数据的存储函数
SQL> CREATE OR REPLACE FUNCTION read_lob(
        col         CLOB,
        read_len    INT,
        start_pos   INT
        )
        RETURN VARCHAR
        IS
            ret_buff VARCHAR;
        BEGIN
            DBMS_LOB.READ(col,read_len,start_pos,ret_buff);
            RETURN ret_buff;
        END;
        /
-- 读取CLOB对象cc的数据
SQL> SELECT read_lob(cc,6,1) ret FROM table_lob WHERE id=1;

+----------+
|   RET    |
+----------+
| CLOB数据 |
+----------+

3.5 场景应用

  • 场景一:当将异常信息写入CLOB字段时,可以使用此方法读取内容进行故障定位
  • 场景二:某些系统使用BLOB存储密文,运维人员可以配合解密函数读取内容,进行辅助调试
  • 场景三:其他一些使用BLOB/CLOB进行数据存储的场景