#DBMS_LOB
DBMS_LOB包提供了一组内置的函数,用于LOB类型(或可与LOB进行隐式转换的类型)相关的运算。DBMS_LOB包不适用于分布式部署。
# COMPARE
DBMS_LOB.COMPARE (
LOB_1 IN BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW,
LOB_2 IN BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW,
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。 |
LOB_2 | 用于比较的第二个LOB数据,类型可以为BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW。 |
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类型进行比较。
- 出现如下情况之一时,函数返回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)
RETURN BIGINT;
GET_LENGTH函数用于获取指定LOB数据的长度,返回一个BIGINT类型的数值。
参数 | 描述 |
---|---|
LOB_LOC | 输入参数,类型可以为BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW。 |
本函数的主要规则为:
- 输入参数为NULL时,函数返回NULL。
- 输入参数为BLOB/RAW类型时,函数返回的是按字节的长度;输入参数为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,
AMOUNT IN INTEGER DEFAULT 32000,
OFFSET IN BIGINT DEFAULT 1)
RETURN RAW/VARCHAR2;
SUB_STR函数用于读取给定LOB数据的子串,返回RAW或者VARCHAR类型的数据。
参数 | 描述 |
---|---|
LOB_LOC | 要读取的LOB数据,类型可以为BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW。 |
AMOUNT | 要读取的字节数(对于BLOB/RAW)或字符数(对于CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR),该值范围为[1, 32000],缺省为32000。 特例情况,因为NCLOB/NCHAR/NVARCHAR按国家字符集UTF-16进行编码,固定按2B一个字符进行计算,该值范围在[16000, 32000],实际按16000最大字符数处理。 |
OFFSET | 偏移量。缺省为1,即从第1个字节(对于BLOB/RAW)或字符(对于CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR)开始读取AMOUNT长度的数据。 |
本函数的主要规则为:
- 函数对LOB_LOC读取从OFFSET开始的AMOUNT长度的字串,单位为字节(对于BLOB/RAW)或字符(对于CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR)。
- 当LOB_LOC为BLOB/RAW类型时,函数返回RAW类型;当LOB_LOC为CLOB/CHAR/VARCHAR类型时,函数返回VARCHAR类型。当LOB_LOC为NCLOB/NCHAR/NVARCHAR类型时,函数返回NVARCHAR类型。
- 出现如下情况之一时,函数返回NULL:
- AMOUNT < 1
- AMOUNT > 32000
- 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,
open_mode IN INTEGER);
OPEN过程用于按指定的模式打开一个LOB。
参数 | 描述 |
---|---|
lob_loc | 待打开的LOB变量,不可为无效的临时LOB。参数的数据类型可以为BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW类型。不可为NULL。 |
open_mode | LOB打开的模式。输入DBMS_LOB.LOB_READONLY,以只读模式打开LOB;输入DBMS_LOB.LOB_READWRITE,以读写模式打开LOB。不可为NULL。 |
示例(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);
CLOSE过程用于关闭一个打开的LOB。
参数 | 描述 |
---|---|
lob_loc | 待关闭的LOB变量,不可为无效的临时LOB。参数的数据类型可以为BLOB/CLOB/NCLOB类型。不可为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)
RETURN INTEGER;
ISOPEN函数用于判断一个LOB是否处于打开状态。如果LOB处于打开状态,则返回1,否则返回0。
参数 | 描述 |
---|---|
lob_loc | LOB变量,不可为无效的临时LOB。参数的数据类型可以为BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW类型。不可为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);
READ过程用于读取LOB指定部分的数据。
参数 | 描述 |
---|---|
lob_loc | 待读取的LOB变量,不可为无效的临时LOB。参数的数据类型可以为BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW类型。不可为NULL。 |
amount | 输入为要读取的BLOB字节数或CLOB/NCLOB字符数,至少为1,不能超过32000;输出为实际读取到的BLOB字节数或CLOB/NCLOB字符数。 |
offset | 读取起点在LOB中的偏移量,BLOB以字节为单位,CLOB/NCLOB以字符为单位,从1开始,不能超过LOB末尾。不可为NULL。 |
buffer | 输出读取到的指定部分LOB数据。当读取BLOB时,参数的数据类型可以为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,不能超过32000。不可为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,不能超过32000。不可为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,
newlen IN BIGINT);
TRIM过程用于将LOB修剪至指定长度。
参数 | 描述 |
---|---|
lob_loc | LOB变量,不可为无效的临时LOB。参数的数据类型可以为BLOB/CLOB/CHAR/VARCHAR/NCLOB/NCHAR/NVARCHAR/RAW类型。在修剪LOB列时需要拥有UPDATE权限。不可为NULL。 |
newlen | 修剪后LOB的新长度,BLOB以字节为单位,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;
INSTR函数用于返回pattern在LOB中第n次出现的位置,从LOB的指定位置开始匹配。如果第n次匹配失败,则返回0。
参数 | 描述 |
---|---|
lob_loc | 待匹配的LOB变量。参数的数据类型可以为BLOB/CLOB/CHAR/VARCHAR/RAW/NCLOB/NCHAR/NVARCHAR类型。 |
pattern | 待匹配的模式。当匹配BLOB时,参数的数据类型可以为RAW/BLOB/CHAR/VARCHAR/NCHAR/NVARCHAR类型。当匹配CLOB/NCLOB时,参数的数据类型可以为RAW/CLOB/NCLOB/CHAR/VARCHAR/NCHAR/NVARCHAR类型。 |
offset | 匹配起点在LOB中的偏移量,BLOB以字节为单位,CLOB/NCLOB以字符为单位,从1开始。 |
nth | 匹配次数。 |
示例(单机、共享集群部署)
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
# 异常
异常 | 描述 |
---|---|
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