#DBMS_LOB

DBMS_LOB包提供了一组内置的函数,用于LOB类型(或可与LOB进行隐式转换的类型)相关的运算。DBMS_LOB包不适用于存算一体分布式集群部署。

# COMPARE

DBMS_LOB.COMPARE (
   LOB_1            IN BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW/BFILE,
   LOB_2            IN BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW/BFILE,
   AMOUNT           IN BIGINT DEFAULT MAX(LENGTH(LOB_1), LENGTH(LOB_2)),
   OFFSET_1         IN BIGINT DEFAULT 1,
   OFFSET_2         IN BIGINT DEFAULT 1)
  RETURN INTEGER;

COMPARE函数用于比较两个LOB数据的大小,返回一个值为0、-1或者1的INTEGER类型数据。

参数 描述
LOB_1 用于比较的第一个LOB数据,类型可以为BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW/BFILE。
LOB_2 用于比较的第二个LOB数据,类型可以为BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW/BFILE。
AMOUNT 用于比较的数据长度,函数从偏移位置开始获取该长度的字节数(对于BLOB/RAW)或字符数(对于CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR)进行比较。缺省取LOB_1与LOB_2数据长度的较大值。
OFFSET_1 LOB_1用于比较的偏移量。缺省为1,即从第1个字节(对于BLOB/RAW)或字符(对于CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR)开始获取AMOUNT长度的数据进行比较。
OFFSET_2 LOB_2用于比较的偏移量。缺省为1,即从第1个字节(对于BLOB/RAW)或字符(对于CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR)开始获取AMOUNT长度的数据进行比较。

本函数的主要规则为:

  • 如果LOB_1和LOB_2在OFFSET和AMOUNT参数指定的范围内完全匹配,函数返回0;如果LOB_1小于LOB_2,函数返回-1;如果LOB_1大于LOB_2,函数返回1。
  • 当LOB_1和LOB_2中的一个为BLOB/RAW类型,而另一个为CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR类型时,函数返回错误。
  • 当LOB_1和LOB_2中的一个为CLOB/CHAR/VARCHAR类型,而另一个为NCLOB/NCHAR/NVARCHAR类型时,函数会将CLOB/CHAR/VARCHAR类型的字符串转码为国家字符集形态,再和NCLOB/NCHAR/NVARCHAR类型进行比较。
  • 当LOB_1和LOB_2中的一个为BFILE类型,则另一个必须为BFILE类型时,比较BFILE对应文件的内容数据。
  • 出现如下情况之一时,函数返回NULL:
    • AMOUNT < 1
    • OFFSET_1 < 1
    • OFFSET_2 < 1
    • 任一个参数输入了NULL
  • AMOUNT、OFFSET_1、OFFSET_2可以为数值型或字符型,函数将隐式转换为BIGINT,该转换对NUMBER类型的小数做截断处理,其他类型的小数按四舍五入处理。
  • NCLOB/NCHAR/NVARCHAR按国家字符集UTF-16进行编码,固定按2B一个字符进行计算。

示例(HEAP表)

CREATE TABLE clob_compare(C1 CLOB, C2 CLOB);
INSERT INTO clob_compare VALUES('124SD', '12332');
--对C1、C2进行完全比较
SELECT DBMS_LOB.COMPARE(C1, C2) compare_res FROM clob_compare;
 COMPARE_RES 
------------ 
           1
--比较C1、C2的前两个字符
SELECT DBMS_LOB.COMPARE(C1, C2, 2) compare_res FROM clob_compare;
 COMPARE_RES 
------------ 
           0
--比较C1的第2、3位字符和C2的第5位字符
SELECT DBMS_LOB.COMPARE(C1, C2, 2, 2, 5) compare_res FROM clob_compare;
 COMPARE_RES 
------------ 
           1

CREATE TABLE raw_compare(C1 RAW(10), C2 RAW(10));
INSERT INTO raw_compare VALUES('AB', 'A234');
--对C1、C2进行完全比较
SELECT DBMS_LOB.COMPARE(C1, C2) compare_res FROM raw_compare;
 COMPARE_RES 
------------ 
           1
--比较C1、C2的第一个字节
SELECT DBMS_LOB.COMPARE(C1, C2, 1) compare_res FROM raw_compare;
 COMPARE_RES 
------------ 
           1
--C1未取到数据,而C2获取到第2个字节的比较
SELECT DBMS_LOB.COMPARE(C1, C2, 2, 2, 2) compare_res FROM raw_compare;
 COMPARE_RES 
------------ 
          -1

# GET_LENGTH

DBMS_LOB.GET_LENGTH (
   LOB_LOC    IN  BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW/BFILE) 
RETURN BIGINT;

GET_LENGTH函数用于获取指定LOB数据的长度,返回一个BIGINT类型的数值。

参数 描述
LOB_LOC 输入参数,类型可以为BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW/BFILE。

本函数的主要规则为:

  • 输入参数为NULL时,函数返回NULL。
  • 输入参数为BLOB/RAW/BFILE类型时,函数返回的是按字节的长度;输入参数为CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR时,函数返回的是按字符的长度。
  • NCLOB/NCHAR/NVARCHAR按国家字符集UTF-16进行编码,固定按2B一个字符进行计算。

示例(HEAP表)

CREATE TABLE get_length(C1 CLOB, C2 BLOB);
INSERT INTO get_length VALUES('1U8WQHSD', 'AF1234');
SELECT DBMS_LOB.GET_LENGTH(C1) cl_len,
	   DBMS_LOB.GET_LENGTH(C2) c2_len
FROM get_length;
               CL_LEN                C2_LEN 
--------------------- --------------------- 
                    8                     3

# GETLENGTH

同GET_LENGTH。

# SUB_STR

DBMS_LOB.SUB_STR (
   LOB_LOC     IN    BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW/BFILE,
   AMOUNT      IN    INTEGER DEFAULT 65534,
   OFFSET      IN    BIGINT DEFAULT 1)
RETURN RAW/VARCHAR2;

SUB_STR函数用于读取给定LOB数据的子串,返回RAW或者VARCHAR类型的数据。

参数 描述
LOB_LOC 要读取的LOB数据,类型可以为BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW/BFILE。
AMOUNT 要读取的字节数(对于BLOB/RAW/BFILE)或字符数(对于CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR),取值范围为[1,65534],缺省为65534。
* 特例1:NCLOB/NCHAR/NVARCHAR按国家字符集UTF-16进行编码(即固定按2B/字符进行计算),此类数据实际将以32767为最大字符数处理。
* 特例2:为避免AMOUNT = 65534时末尾截断出现残字(报错character set mismatch),系统会自动舍弃末尾的残字。若发生此类舍弃现象,输出长度会小于65534。
OFFSET 偏移量。缺省为1,即从第1个字节(对于BLOB/RAW/BFILE)或字符(对于CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR)开始读取AMOUNT长度的数据。

本函数的主要规则为:

  • 函数对LOB_LOC读取从OFFSET开始的AMOUNT长度的字串,单位为字节(对于BLOB/RAW)或字符(对于CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR)。
  • 当LOB_LOC为BLOB/RAW/BFILE类型时,函数返回RAW类型;当LOB_LOC为CLOB/CHAR/VARCHAR类型时,函数返回VARCHAR类型。当LOB_LOC为NCLOB/NCHAR/NVARCHAR类型时,函数返回NVARCHAR类型。
  • 出现如下情况之一时,函数返回NULL:
    • AMOUNT < 1
    • AMOUNT > 65534
    • OFFSET < 1
    • 任一个参数输入了NULL

示例(HEAP表)

CREATE TABLE sub_str(C1 CLOB, C2 BLOB);
INSERT INTO sub_str VALUES('1U8WQHSD', 'AF1234');
--读取全部的C1和C2
SELECT DBMS_LOB.SUB_STR(C1) sub_c1,
	   DBMS_LOB.SUB_STR(C2) sub_c2 
FROM sub_str;
SUB_C1             SUB_C2          
------------------ ------------------
1U8WQHSD           AF1234                                                        

--从C1/C2的第3个字符/字节开始读取2个字符/字节
SELECT DBMS_LOB.SUB_STR(C1, 2, 3) sub_c1,
	   DBMS_LOB.SUB_STR(C2, 2, 3) sub_c2
FROM sub_str;
SUB_C1             SUB_C2          
------------------ ------------------
8W                 34    

# SUBSTR

同SUB_STR。

# CREATETEMPORARY

DBMS_LOB.CREATETEMPORARY (
   lob_loc  IN OUT  BLOB/CLOB/NCLOB,
   cache    IN      BOOLEAN DEFAULT FALSE,
   dur      IN      INTEGER DEFAULT 10);

CREATETEMPORARY过程用于创建一个长度为0的临时LOB。

参数 描述
lob_loc LOB变量,参数的数据类型可以为BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW类型。
cache 保留字段,使用缺省值。BOOLEAN类型或可隐式转换为BOOLEAN类型的参数。不可为NULL。
dur 保留字段,使用缺省值。INTEGER类型或可隐式转换为INTEGER类型的参数的数值范围与INTEGER类型的数值范围相同。不可为NULL。

示例(单机、共享集群部署)

DECLARE
  clob1 CLOB;
  len INT;
BEGIN
  dbms_lob.createtemporary(clob1);
  len := dbms_lob.getlength(clob1);
  dbms_output.put_line(len);
END;
/
--result
0

# FREETEMPORARY

DBMS_LOB.FREETEMPORARY (
   lob_loc  IN OUT  BLOB/CLOB/NCLOB);

FREETEMPORARY过程用于释放一个临时LOB。临时LOB释放后长度为0,在DBMS_LOB高级包中视为无效的临时LOB。

参数 描述
lob_loc 临时LOB变量,不可为无效的临时LOB。参数的数据类型可以为BLOB/CLOB/NCLOB类型。不可为NULL。

示例(单机、共享集群部署)

DECLARE
  clob1 CLOB;
BEGIN
  dbms_lob.createtemporary(clob1);
  dbms_lob.freetemporary(clob1);
  dbms_output.put_line(LENGTH(clob1));
END;
/
--result
0

# ISTEMPORARY

DBMS_LOB.ISTEMPORARY (
   lob_loc  IN  BLOB/CLOB/NCLOB)
RETURN INTEGER;

ISTEMPORARY过程用于判断输入的LOB是否为临时LOB。

如果给定的参数是有效的临时LOB,则返回1。

如果给定的参数是无效的临时LOB或者不是临时LOB,则返回0。

如果给定的参数为NULL,则返回NULL。

参数 描述
lob_loc LOB变量,参数的数据类型可以为BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW类型。

示例(单机、共享集群部署)

CREATE TABLE isnot_templob(id INT, c1 CLOB);
INSERT INTO isnot_templob VALUES(1, 'lob');

DECLARE
  clob1 CLOB;
  istemp INT;
BEGIN
  --valid TEMPORARY LOB
  dbms_lob.createtemporary(clob1);
  istemp := dbms_lob.istemporary(clob1);
  dbms_output.put_line(istemp);
  --invalid TEMPORARY LOB
  dbms_lob.freetemporary(clob1);
  istemp := dbms_lob.istemporary(clob1);
  dbms_output.put_line(istemp);
  --IS NOT TEMPORARY LOB
  SELECT c1 INTO clob1 FROM isnot_templob WHERE id = 1;
  istemp := dbms_lob.istemporary(clob1);
  dbms_output.put_line(istemp);
END;
/
--result
1
0
0

# OPEN

DBMS_LOB.OPEN (
   lob_loc    IN OUT  BLOB/CLOB/NCLOB/BFILE,
   open_mode  IN      INTEGER);

OPEN过程用于按指定的模式打开一个LOB。

参数 描述
lob_loc 待打开的LOB变量,不可为无效的临时LOB,不可为NULL。参数的数据类型可以为BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW/BFILE类型。
当lob_loc为BFILE类型时,同一会话中允许打开的文件数上限受SESSION_MAX_OPEN_FILES参数控制。
open_mode LOB打开的模式,不能为空。
* DBMS_LOB.LOB_FILEONLY:表示以只读模式打开BFILE。
* DBMS_LOB.LOB_READONLY:表示以只读模式打开LOB。
* DBMS_LOB.LOB_READWRITE表示以读写模式打开LOB。
若待打开的lob_loc为BFILE,open_mode只能为DBMS_LOB.LOB_READONLY或DBMS_LOB.FILE_READONLY。

示例(HEAP表)

DECLARE
  clob1 CLOB := 'read lob';
  amount INT := 3;
  buffer VARCHAR(10);
BEGIN
  dbms_lob.OPEN(clob1, dbms_lob.lob_readonly);
  dbms_lob.read(clob1, amount, 6, buffer);
  dbms_output.put_line(buffer);
  dbms_lob.CLOSE(clob1);
END;
/
--result
lob

# CLOSE

DBMS_LOB.CLOSE (
   lob_loc  IN OUT  BLOB/CLOB/NCLOB/BFILE);

CLOSE过程用于关闭一个打开的LOB。

参数 描述
lob_loc 待关闭的LOB变量,不可为无效的临时LOB。参数的数据类型可以为BLOB/CLOB/NCLOB/BFILE类型。不可为NULL。

示例(HEAP表)

DECLARE
  clob1 CLOB := 'lob';
BEGIN
  dbms_lob.OPEN(clob1, dbms_lob.lob_readwrite);
  dbms_lob.write(clob1, 5, 5, 'write');
  dbms_output.put_line(clob1);
  dbms_lob.CLOSE(clob1);
END;
/
--result
lob write

# ISOPEN

DBMS_LOB.ISOPEN (
   lob_loc  IN  BLOB/CLOB/NCLOB/BFILE) 
RETURN INTEGER; 

ISOPEN函数用于判断一个LOB是否处于打开状态。如果LOB处于打开状态,则返回1,否则返回0。

参数 描述
lob_loc LOB变量,不可为无效的临时LOB。参数的数据类型可以为BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW/BFILE类型。不可为NULL。

示例(HEAP表)

DECLARE
  clob1 CLOB := 'lob';
  isopen INT;
BEGIN
  isopen := dbms_lob.isopen(clob1);
  dbms_output.put_line(isopen);
  dbms_lob.OPEN(clob1, dbms_lob.lob_readwrite);
  isopen := dbms_lob.isopen(clob1);
  dbms_output.put_line(isopen);
  dbms_lob.CLOSE(clob1);
  isopen := dbms_lob.isopen(clob1);
  dbms_output.put_line(isopen);
END;
/
--result
0
1
0

# READ

DBMS_LOB.READ (
   lob_loc  IN      BLOB,
   amount   IN OUT  BIGINT,
   offset   IN      BIGINT,
   buffer   OUT     RAW);

DBMS_LOB.READ (
   lob_loc  IN      CLOB,
   amount   IN OUT  BIGINT,
   offset   IN      BIGINT,
   buffer   OUT     VARCHAR);

DBMS_LOB.READ (
   lob_loc  IN      NCLOB,
   amount   IN OUT  BIGINT,
   offset   IN      BIGINT,
   buffer   OUT     NVARCHAR);
   
 DBMS_LOB.READ (
   lob_loc  IN      BFILE,
   amount   IN OUT  BIGINT,
   offset   IN      BIGINT,
   buffer   OUT     RAW);

READ过程用于读取LOB指定部分的数据。

参数 描述
lob_loc 待读取的LOB变量,不可为无效的临时LOB。参数的数据类型可以为BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW/BFILE类型。不可为NULL。
amount 输入为要读取的BLOB/BFILE字节数或CLOB/NCLOB字符数,至少为1,不能超过65534;输出为实际读取到的BLOB/BFILE字节数或CLOB/NCLOB字符数。
offset 读取起点在LOB中的偏移量,BLOB/BFILE以字节为单位,CLOB/NCLOB以字符为单位,从1开始,不能超过LOB末尾。不可为NULL。
buffer 输出读取到的指定部分LOB数据。当读取BLOB/BFILE时,参数的数据类型可以为RAW/BLOB/CHAR/VARCHAR/NCHAR/NVARCHAR类型;当读取CLOB时,参数的数据类型可以为CLOB/NCLOB/CHAR/VARCHAR/NCHAR/NVARCHAR/RAW类型。

示例(单机、共享集群部署)

DECLARE
  clob1 CLOB := 'read lob';
  amount INT := 10;
  buffer VARCHAR(10);
BEGIN
  dbms_lob.read(clob1, amount, 6, buffer);
  dbms_output.put_line(buffer);
  dbms_output.put_line(amount);
END;
/
--result
lob
3

# WRITE

DBMS_LOB.WRITE (
   lob_loc  IN OUT  BLOB,
   amount   IN      BIGINT,
   offset   IN      BIGINT,
   buffer   IN      RAW);

DBMS_LOB.WRITE (
   lob_loc  IN OUT  CLOB,
   amount   IN      BIGINT,
   offset   IN      BIGINT,
   buffer   IN      VARCHAR);

DBMS_LOB.WRITE (
   lob_loc  IN OUT  NCLOB,
   amount   IN      BIGINT,
   offset   IN      BIGINT,
   buffer   IN      NVARCHAR);

WRITE过程用于在LOB的指定位置写入指定数量的字节或字符。

参数 描述
lob_loc 待写入的LOB变量,不可为无效的临时LOB。在写入LOB列时需要拥有UPDATE权限。不可为NULL。
amount 写入BLOB的字节数或写入CLOB/NCLOB的字符数,至少为1,不能超过65534。不可为NULL。
offset 写入起点在LOB中的偏移量,BLOB以字节为单位,CLOB/NCLOB以字符为单位,从1开始。不可为NULL。
buffer 待写入LOB的数据,若为LOB类型,不可为无效的临时LOB。不可为NULL。

示例(HEAP表)

DECLARE
  clob1 CLOB := 'lob';
  buffer VARCHAR(10) := 'write lob';
BEGIN
  dbms_lob.write(clob1, 5, 5, buffer);
  dbms_output.put_line(clob1);
END;
/
--result
lob write

# APPEND

DBMS_LOB.APPEND (
   dest_lob  IN OUT  BLOB, 
   src_lob   IN      BLOB); 

DBMS_LOB.APPEND (
   dest_lob  IN OUT  CLOB, 
   src_lob   IN      CLOB); 

DBMS_LOB.APPEND (
   dest_lob  IN OUT  NCLOB, 
   src_lob   IN      NCLOB); 

APPEND过程用于将源LOB的数据附加到目标LOB的末尾。

参数 描述
dest_lob 目标LOB变量,不可为无效的临时LOB。在更新LOB列时需要拥有UPDATE权限。参数的数据类型可以为BLOB/RAW/CLOB/NCLOB/CHAR/VARCHAR/NCHAR/NVARCHAR类型。
src_lob 源LOB变量,不可为无效的临时LOB。参数的数据类型可以为BLOB/RAW/CLOB/NCLOB/CHAR/VARCHAR/NCHAR/NVARCHAR类型。

示例(HEAP表)

DECLARE
  dest_clob CLOB := 'lob';
  src_clob CLOB := ' append';
BEGIN
  dbms_lob.append(dest_clob, src_clob);
  dbms_output.put_line(dest_clob);
END;
/
--result
lob append

# WRITEAPPEND

DBMS_LOB.WRITEAPPEND (
   lob_loc  IN OUT  BLOB, 
   amount   IN      BIGINT, 
   buffer   IN      RAW); 

DBMS_LOB.WRITEAPPEND (
   lob_loc  IN OUT  CLOB, 
   amount   IN      BIGINT, 
   buffer   IN      VARCHAR);

DBMS_LOB.WRITEAPPEND (
   lob_loc  IN OUT  NCLOB, 
   amount   IN      BIGINT, 
   buffer   IN      NVARCHAR);   

WRITEAPPEND过程用于将指定数量的字节或字符附加到LOB的末尾。

参数 描述
lob_loc 待附加数据的LOB变量,不可为无效的临时LOB。在更新LOB列时需要拥有UPDATE权限。参数的数据类型可以为BLOB/CLOB/VARCHAR/RAW/NCLOB/NVARCHAR类型。不可为NULL。
amount 附加的BLOB字节数或CLOB/NCLOB字符数,至少为1,不能超过65534。不可为NULL。
buffer 待附加到LOB末尾的数据,不可为无效的临时LOB。参数的数据类型可以为RAW/BLOB/CHAR/VARCHAR/NCHAR/NVARCHAR类型。

示例(HEAP表)

DECLARE
  clob1 CLOB := 'lob';
  buffer VARCHAR(20) := ' append lob';
BEGIN
  dbms_lob.writeappend(clob1, 7, buffer);
  dbms_output.put_line(clob1);
END;
/
--result
lob append

# COPY

DBMS_LOB.COPY (
  dest_lob     IN OUT  BLOB,
  src_lob      IN      BLOB,
  amount       IN      BIGINT,
  dest_offset  IN      BIGINT DEFAULT 1,
  src_offset   IN      BIGINT DEFAULT 1);

DBMS_LOB.COPY (
  dest_lob     IN OUT  CLOB,
  src_lob      IN      CLOB,
  amount       IN      BIGINT,
  dest_offset  IN      BIGINT DEFAULT 1,
  src_offset   IN      BIGINT DEFAULT 1);

DBMS_LOB.COPY (
  dest_lob     IN OUT  NCLOB,
  src_lob      IN      NCLOB,
  amount       IN      BIGINT,
  dest_offset  IN      BIGINT DEFAULT 1,
  src_offset   IN      BIGINT DEFAULT 1);

COPY过程用于将指定部分的源LOB数据拷贝到目标LOB的指定位置。

参数 描述
dest_lob 目标LOB变量,不可为无效的临时LOB。在更新LOB列时需要拥有UPDATE权限。参数的数据类型可以为BLOB/RAW/CLOB/NCLOB/CHAR/VARCHAR/NCHAR/NVARCHAR类型。
src_lob 源LOB变量,不可为无效的临时LOB。参数的数据类型可以为BLOB/RAW/CLOB/NCLOB/CHAR/VARCHAR/NCHAR/NVARCHAR类型。
amount 拷贝的BLOB字节数或CLOB/NCLOB字符数,至少为1。不可为NULL。
dest_offset 目标LOB偏移量,BLOB以字节为单位,CLOB/NCLOB以字符为单位,从1开始。不可为NULL。
src_offset 源LOB偏移量,BLOB以字节为单位,CLOB/NCLOB以字符为单位,从1开始。不可为NULL。

示例(HEAP表)

DECLARE
  clob1 CLOB := 'lob';
BEGIN
  dbms_lob.copy(clob1, 'copy lob', 4, 5, 1);
  dbms_output.put_line(clob1);
END;
/
--result
lob copy

# ERASE

DBMS_LOB.ERASE (
   lob_loc  IN OUT  BLOB/CLOB/NCLOB,
   amount   IN OUT  BIGINT,
   offset   IN      BIGINT DEFAULT 1);

ERASE过程用于擦除指定部分的LOB数据。

参数 描述
lob_loc LOB变量,不可为无效的临时LOB。参数的数据类型可以为BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW类型。在擦除LOB列时需要拥有UPDATE权限。不可为NULL。
amount 擦除的BLOB字节数或CLOB/NCLOB字符数,至少为1。不可为NULL。
offset 待擦除的数据在LOB中的偏移量,BLOB以字节为单位,CLOB/NCLOB以字符为单位,从1开始。不可为NULL。

示例(HEAP表)

DECLARE
  clob1 CLOB := 'loberaseerase';
  amount INT := 5;
BEGIN
  dbms_lob.erase(clob1, amount, 4);
  dbms_output.put_line(clob1);
END;
/
--result
lob     erase

# TRIM

DBMS_LOB.TRIM (
   lob_loc  IN OUT  BLOB/CLOB/NCLOB/BFILE,
   newlen   IN      BIGINT);

TRIM过程用于将LOB修剪至指定长度。

参数 描述
lob_loc LOB变量,不可为无效的临时LOB。参数的数据类型可以为BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW/BFILE类型。在修剪LOB列时需要拥有UPDATE权限。不可为NULL。
newlen 修剪后LOB的新长度,BLOB/BFILE以字节为单位,CLOB/NCLOB以字符为单位,至少为0,不能超过LOB的长度。不可为NULL。

示例(HEAP表)

DECLARE
  clob1 CLOB := 'lob trim newlen';
BEGIN
  dbms_lob.trim(clob1, 8);
  dbms_output.put_line(clob1);
END;
/
--result
lob trim

# INSTR

DBMS_LOB.INSTR (
   lob_loc  IN  BLOB,
   pattern  IN  RAW,
   offset   IN  BIGINT DEFAULT 1,
   nth      IN  BIGINT DEFAULT 1)
RETURN BIGINT;

DBMS_LOB.INSTR (
   lob_loc  IN  CLOB,
   pattern  IN  VARCHAR,
   offset   IN  BIGINT DEFAULT 1,
   nth      IN  BIGINT DEFAULT 1)
RETURN BIGINT;

DBMS_LOB.INSTR (
   lob_loc  IN  NCLOB,
   pattern  IN  NVARCHAR,
   offset   IN  BIGINT DEFAULT 1,
   nth      IN  BIGINT DEFAULT 1)
RETURN BIGINT;

DBMS_LOB.INSTR (
   lob_loc  IN  BFILE,
   pattern  IN  RAW,
   offset   IN  BIGINT DEFAULT 1,
   nth      IN  BIGINT DEFAULT 1)
RETURN BIGINT;

INSTR函数用于返回pattern所表示的子字符串在CLOB/BLOB/NCLOB格式的大对象中第n次出现的位置,匹配时可以从LOB的指定位置开始匹配,如果匹配失败,则返回0。

参数 描述
lob_loc 待匹配的大对象LOB变量。参数的数据类型可以为BLOB/CLOB/BFILE/CHAR/VARCHAR/RAW/NCLOB/NCHAR/NVARCHAR类型。
pattern 待匹配的字符串,长度最大为65534。当匹配BLOB/BFILE时,参数的数据类型可以为RAW/BLOB/CHAR/VARCHAR/NCHAR/NVARCHAR类型。当匹配CLOB/NCLOB时,参数的数据类型可以为RAW/CLOB/NCLOB/CHAR/VARCHAR/NCHAR/NVARCHAR类型。
offset 匹配起点在LOB中的偏移量,BLOB以字节为单位,CLOB/NCLOB以字符为单位,默认从1开始。
nth 匹配次数。不设置时默认表示第1次匹配命中的位置。

示例(单机、共享集群部署)

DECLARE
  clob1 CLOB := 'lob instr lob instr';
  pos BIGINT;
BEGIN
  pos := dbms_lob.instr(clob1, 'instr', 4, 2);
  dbms_output.put_line(pos);
END;
/
--result
15

# FILEOPEN

DBMS_LOB.FILEOPEN (
   lob_loc     IN OUT  BFILE,
   open_mode   IN      INTEGER);

FILEOPEN过程用于只读方式打开BFILE。

同一会话中允许打开的文件数上限受SESSION_MAX_OPEN_FILES参数控制。

参数 描述
lob_loc BFILE定位器,不可为NULL。
open_mode BFILE打开的模式:支持DBMS_LOB.LOB_READONLY或DBMS_LOB.FILE_READONLY,表示以只读方式打开BFILE,可缺省。

示例(HEAP表)

CREATE OR REPLACE DIRECTORY TEST_DIR AS '/tmp';
!echo "test file" > /tmp/test.txt
DECLARE
  lob_loc bfile := BFILENAME('TEST_DIR', 'test.txt');
BEGIN
  dbms_lob.fileopen(lob_loc, 0);
  dbms_output.put_line('file opened');
  dbms_lob.fileclose(lob_loc);
END;
/
--result
file opened

# FILEISOPEN

DBMS_LOB.FILEISOPEN (
   lob_loc     IN  BFILE);

FILEISOPEN方法用于检查BFILE定位器指定的文件是否打开。

如果文件处于打开状态,则返回1,否则返回0。

参数 描述
lob_loc BFILE定位器,不可为NULL。

示例(HEAP表)

CREATE OR REPLACE DIRECTORY TEST_DIR AS '/tmp';
!echo "test file" > /tmp/test.txt
DECLARE
  lob_loc bfile := BFILENAME('TEST_DIR', 'test.txt');
BEGIN
  DBMS_OUTPUT.PUT_LINE('is file open '||DBMS_LOB.FILEISOPEN(lob_loc));
END;
/
--result
is file open 0

# FILEEXISTS

DBMS_LOB.FILEEXISTS (
   lob_loc     IN  BFILE);

FILEEXISTS方法用于查看BFILE定位器对应的实际文件是否存在。

如果文件存在,则返回1,否则返回0。

参数 描述
lob_loc BFILE定位器,不可为NULL。

示例(HEAP表)

CREATE OR REPLACE DIRECTORY TEST_DIR AS '/tmp';
!echo "test file" > /tmp/test.txt
DECLARE
  lob_loc bfile := BFILENAME('TEST_DIR', 'test.txt');
BEGIN
   DBMS_OUTPUT.PUT_LINE('is file exist '||DBMS_LOB.FILEEXISTS(lob_loc));
END;
/
--result
is file exist 1

# FILEGETNAME

DBMS_LOB.FILEGETNAME (
   lob_loc     IN  BFILE,
   dir_alias   OUT VARCHAR
   filename    OUT VARCHAR);

FILEGETNAME过程根据BFILE定位器返回目录别名与文件名,并不判断物理文件或目录是否实际存在。

参数 描述
lob_loc BFILE定位器,不可为NULL。
dir_alias 目录别名,不可为NULL。
filename 文件名,不可为NULL。

示例(HEAP表)

DECLARE
  lob_loc bfile;
  dir_alias VARCHAR(30);
  filename VARCHAR(30);
BEGIN
  lob_loc := BFILENAME('TEST_DIR', 'test.txt');
  dbms_lob.filegetname(lob_loc, dir_alias, filename);
  dbms_output.put_line('dir_alias is ' || dir_alias);
  dbms_output.put_line('filename is ' || filename);
END;
/
--result
dir_alias is TEST_DIR
filename is test.txt

# LOADCLOBFROMFILE

DBMS_LOB.LOADCLOBFROMFILE (
   dest_lob     IN OUT  CLOB/NCLOB,
   src_bfile    IN      BFILE,
   amount       IN      BIGINT
   dest_offset  IN OUT  BIGINT,
   src_offset   IN OUT  BIGINT,
   bfile_csid   IN      NUMBER,
   lang_context IN OUT  INTEGER,
   warning      OUT     INTEGER);

LOADCLOBFROMFILE过程将BFILE的数据加载到CLOB或NCLOB,加载时进行必要的字符集转换。

参数 描述
dest_lob 需要加载到的CLOB/NCLOB,不可为NULL。
src_bfile 源端BFILE定位器,不可为NULL。
amount 从源端BFILE加载的字节数,不可为NULL。使用DBMS_LOB.LOBMAXSIZE表示加载到BFILE的末尾。
dest_offset 以字符为单位,(IN)dest_offest指定目标端CLOB/NCLOB的起始位置开始加载(源点:1),(OUT)dest_offest表示本次加载结束后的新的偏移量,也是下次继续加载的起始位置。dest_offest始终指向加载结束后第一个完整字符的开头,如果最后一个字符不完整,则偏移量将返回到该不完整字符的开头。
src_offset 以字节为单位,(IN)src_offset指定源端BFILE的偏移量开始加载(源点:1),(OUT)src_offset表示本次加载结束后源端BFILE的字节偏移量,也是下次继续读取的起始位置。
bfile_csid 源端BFILE的字符集,默认为0。对应的取值范围有:
ASCII:1
GBK:852
UTF-8:873
ISO88591:31
UTF-16:2000
GB18030:854
lang_context 当前加载状况的上下文信息,默认为0。该参数仅作兼容适配,对其合法性无特殊校验。
warning 警告信息,这表示加载过程中发生了异常。目前,唯一可能的警告是不可转换字符,当源字符无法正确转换为目标字符时,就会发生这种情况。该信息定义为常量值DBMS_LOB.WARN_INCONVERTIBLE_CHAR

示例(HEAP表)

CREATE OR REPLACE DIRECTORY TEST_DIR AS '/tmp';
!echo "test file" > /tmp/test.txt
DECLARE
  l_clob CLOB;
  l_bfile BFILE;
  l_src_offset NUMBER := 1;
  l_dest_offset NUMBER := 1;
  l_lang_context NUMBER := 0;
  l_warning NUMBER;
BEGIN
  DBMS_LOB.CREATETEMPORARY(l_clob, TRUE);
  l_bfile := BFILENAME('TEST_DIR', 'test.txt');
  DBMS_LOB.FILEOPEN(l_bfile, 0);
  dbms_lob.loadclobfromfile(
      dest_lob    => l_clob,
      src_bfile   => l_bfile,
      amount      => DBMS_LOB.LOBMAXSIZE,
      dest_offset => l_dest_offset,
      src_offset  => l_src_offset,
      bfile_csid  => 0,
      lang_context  => l_lang_context,
      warning       => l_warning
  );
  DBMS_LOB.FILECLOSE(l_bfile);
END;
/

# LOADBLOBFROMFILE

DBMS_LOB.LOADBLOBFROMFILE (
   dest_lob     IN OUT  BLOB,
   src_bfile    IN      BFILE,
   amount       IN      BIGINT
   dest_offset  IN OUT  BIGINT,
   src_offset   IN OUT  BIGINT)

LOADBLOBFROMFILE过程将BFILE的数据加载到BLOB。

参数 描述
dest_lob 需要加载到的BLOB,不可为NULL。
src_bfile 源端BFILE定位器,不可为NULL。
amount 从源端BFILE加载的字节数,不可为NULL。使用DBMS_LOB.LOBMAXSIZE表示加载到BFILE的末尾。
dest_offset 以字节为单位,(IN)dest_offest指定目标端BLOB的起始位置开始加载(原点:1),(OUT)dest_offest表示本次加载结束后的新的偏移量,也是下次继续加载的起始位置。
src_offset 以字节为单位,(IN)src_offset指定源端BFILE的偏移量开始加载(原点:1),(OUT)src_offset表示本次加载结束后源端BFILE的字节偏移量,也是下次继续读取的起始位置。

示例(HEAP表)

CREATE OR REPLACE DIRECTORY TEST_DIR AS '/tmp';
!echo "test file" > /tmp/test.txt
DECLARE
  l_blob BLOB;
  l_bfile BFILE;
  l_src_offset NUMBER := 1;
  l_dest_offset NUMBER := 1;
BEGIN
  DBMS_LOB.CREATETEMPORARY(l_blob, TRUE);
  l_bfile := BFILENAME('TEST_DIR', 'test.txt');
  DBMS_LOB.FILEOPEN(l_bfile, 0);
  dbms_lob.loadblobfromfile(
      dest_lob    => l_blob,
      src_bfile   => l_bfile,
      amount      => DBMS_LOB.LOBMAXSIZE,
      dest_offset => l_dest_offset,
      src_offset  => l_src_offset
  );
  DBMS_LOB.FILECLOSE(l_bfile);
END;
/

# FILECLOSE

DBMS_LOB.FILEOCLOSE (
   lob_loc     IN OUT  BFILE);

FILECLOSE过程用于关闭某个已打开的BFILE。

参数 描述
lob_loc BFILE定位器,不可为NULL。

示例(HEAP表)

CREATE OR REPLACE DIRECTORY TEST_DIR AS '/tmp';
!echo "test file" > /tmp/test.txt
DECLARE
  lob_loc bfile;
BEGIN
  lob_loc := BFILENAME('TEST_DIR', 'test.txt');
  dbms_lob.fileopen(lob_loc);
  dbms_lob.fileclose(lob_loc);
  dbms_output.put_line('file closed');
END;
/
--result
file closed

# FILECLOSEALL

DBMS_LOB.FILEOCLOSEALL ();

FILECLOSEALL过程用于关闭当前session所有打开的BFILE。

示例(HEAP表)

BEGIN
  dbms_lob.filecloseall();
  dbms_output.put_line('all file closed');
END;
/
--result
all file closed

# 常量定义

常量 类型 描述
DBMS_LOB.LOBMAXSIZE BIGINT 2^63 - 1 LOB 的最大大小(以字节为单位)
DBMS_LOB.LOB_READONLY INTEGER 0 文件打开方式:只读方式打开指定LOB
DBMS_LOB.LOB_READWRITE INTEGER 1 文件打开方式:读写方式打开指定LOB
DBMS_LOB.FILE_READONLY INTEGER 0 文件打开方式:只读方式打开指定BFILE
DBMS_LOB.DEFAULT_CSID INTEGER 0 默认CSID,指定源LOB的字符集为数据库字符集
DBMS_LOB.DEFAULT_LANG_CTX INTEGER 0 默认语言上下文信息
DBMS_LOB.NO_WARNING INTEGER 0 无警告
DBMS_LOB.WARN_INCONVERTIBLE_CHAR INTEGER 1 源端字符集不能正确转换的警告

# 异常

异常 描述
INVALID_ARGVAL 参数超出数值范围(除数字溢出外)。
UNOPENED_FILE 关闭未打开的LOB。

示例(单机、共享集群部署)

--invalid_argval exception
DECLARE
  c1 CLOB:='12345';
BEGIN
  dbms_lob.write(c1,0,1,'6');
EXCEPTION
  WHEN DBMS_LOB.INVALID_ARGVAL THEN
    dbms_output.put_line('argument value out of range');
END;
/
--result
argument value out of range

--unopened_file exception
DECLARE
  c1 CLOB:='12345';
BEGIN
  dbms_lob.CLOSE(c1);
EXCEPTION
  WHEN DBMS_LOB.UNOPENED_FILE THEN
    dbms_output.put_line('try to close unopened lob');
END;
/
--result
try to close unopened lob
edit-icon
反馈
coperate-icon
coperate
合作
communication-icon
communicate
交流