DBMS_LOB
接口介绍
高级功能包DBMS_LOB支持的所有接口请参见表1。
接口名称 |
描述 |
---|---|
获取并返回指定的LOB类型对象的长度。 |
|
打开一个LOB返回一个LOB的描述符。 |
|
根据指定的长度及起始位置偏移读取LOB内容的一部分到BUFFER缓冲区。 |
|
根据指定长度及起始位置偏移将BUFFER中内容写入到LOB中。 |
|
根据指定长度将BUFFER中内容写入到LOB的尾部。 |
|
根据指定长度及起始位置偏移将BLOB内容写入到另一个BLOB中。 |
|
根据指定长度及起始位置偏移删除BLOB中的内容。 |
|
关闭已经打开的LOB描述符。 |
|
返回一个字符串在LOB中第N次出现的位置。 |
|
比较两个LOB或者两个LOB的某一部分。 |
|
用于读取一个LOB的子串,返回读取的字节个数或者字符个数。 |
|
用于截断指定长度的LOB,执行完会将LOB的长度设置为newlen参数指定的长度。 |
|
创建一个临时的BLOB或者CLOB。 |
|
将原LOB的内容拼接到目的LOB中。 |
- DBMS_LOB.GETLENGTH
存储过程GETLENGTH获取并返回指定的LOB类型对象的长度。
DBMS_LOB.GETLENGTH函数原型为:
1 2 3 4 5 6 7
DBMS_LOB.GETLENGTH ( lob_loc IN BLOB) RETURN INTEGER; DBMS_LOB.GETLENGTH ( lob_loc IN CLOB) RETURN INTEGER;
表2 DBMS_LOB.GETLENGTH接口参数说明 参数
描述
lob_loc
待获取长度的指定的LOB类型的对象。
- DBMS_LOB.OPEN
存储过程打开一个LOB,并返回一个LOB描述符,该过程无实际意义,仅用于兼容。
DBMS_LOB.OPEN函数原型为:
1 2 3 4 5 6 7
DBMS_LOB.LOB ( lob_loc INOUT BLOB, open_mode IN BINARY_INTEGER); DBMS_LOB.LOB ( lob_loc INOUT CLOB, open_mode IN BINARY_INTEGER);
表3 DBMS_LOB.OPEN接口参数说明 参数
描述
lob_loc
被打开的一个BLOB或者CLOB描述符。
open_mode IN BINARY_INTEGER
打开的模式,目前支持DBMS_LOB.LOB_READWRITE
- DBMS_LOB.READ
存储过程READ根据指定长度及起始位置偏移读取LOB内容的一部分到BUFFER缓冲区。
DBMS_LOB.READ函数原型为:
1 2 3 4 5 6 7 8 9 10 11
DBMS_LOB.READ ( lob_loc IN BLOB, amount IN INTEGER, offset IN INTEGER, buffer OUT RAW); DBMS_LOB.READ ( lob_loc IN CLOB, amount IN OUT INTEGER, offset IN INTEGER, buffer OUT VARCHAR2);
表4 DBMS_LOB.READ接口参数说明 参数
说明
lob_loc
待读入的指定的LOB类型的对象。
amount
读入长度。
说明:如果读入长度为负,会收到错误提示“ERROR: argument 2 is null, invalid, or out of range.”
offset
指定从LOB内容的哪个位置开始读取的偏移(即相对LOB内容起始位置的字节数)。
buffer
读取LOB内容后存放的目标缓冲区。
- DBMS_LOB.WRITE
存储过程WRITE根据指定长度及起始位置偏移将BUFFER中内容写入到LOB变量中。
DBMS_LOB.WRITE函数原型为:
1 2 3 4 5 6 7 8 9 10 11
DBMS_LOB.WRITE ( lob_loc IN OUT BLOB, amount IN INTEGER, offset IN INTEGER, buffer IN RAW); DBMS_LOB.WRITE ( lob_loc IN OUT CLOB, amount IN INTEGER, offset IN INTEGER, buffer IN VARCHAR2);
表5 DBMS_LOB.WRITE接口参数说明 参数
说明
lob_loc
待写入的指定的LOB类型的对象。
amount
写入长度。
说明:如果写入长度小于1或写入长度大于待写入的内容长度,则报错。
offset
指定从LOB内容的哪个位置开始写入的偏移(即相对LOB内容起始位置的字节数)。
说明:如果偏移量小于1或偏移量大于LOB类型最大长度,则报错。
buffer
待写入的内容。
- DBMS_LOB.WRITEAPPEND
存储过程WRITEAPPEND根据指定长度将BUFFER中内容写入到LOB的尾部。
DBMS_LOB.WRITEAPPEND函数原型为:
1 2 3 4 5 6 7 8 9
DBMS_LOB.WRITEAPPEND ( lob_loc IN OUT BLOB, amount IN INTEGER, buffer IN RAW); DBMS_LOB.WRITEAPPEND ( lob_loc IN OUT CLOB, amount IN INTEGER, buffer IN VARCHAR2);
表6 DBMS_LOB.WRITEAPPEND接口参数说明 参数
说明
lob_loc
待写入的指定的LOB类型的对象。
amount
写入长度。
说明:如果写入长度小于1或写入长度大于待写入的内容长度,则报错。
buffer
待写入的内容。
- DBMS_LOB.COPY
存储过程COPY根据指定长度及起始位置偏移将BLOB内容拷贝到另一个BLOB中。
DBMS_LOB.COPY函数原型为:
1 2 3 4 5 6
DBMS_LOB.COPY ( dest_lob IN OUT BLOB, src_lob IN BLOB, amount IN INTEGER, dest_offset IN INTEGER DEFAULT 1, src_offset IN INTEGER DEFAULT 1);
表7 DBMS_LOB.COPY接口参数说明 参数
说明
dest_lob
待拷入的BLOB类型对象。
src_lob
待拷出的BLOB类型对象。
amount
拷贝长度。
说明:如果拷入长度小于1或拷入长度大于BLOB类型最大长度,则报错。
dest_offset
指定从BLOB内容的哪个位置开始拷入的偏移(即相对BLOB内容起始位置的字节数)。
说明:如果偏移量小于1或偏移量大于BLOB类型最大长度,则报错。
src_offset
指定从BLOB内容的哪个位置开始拷出的偏移(即相对BLOB内容起始位置的字节数)。
说明:如果偏移量小于1或偏移量大于拷贝来源BLOB的长度,则报错。
- DBMS_LOB.ERASE
存储过程ERASE根据指定长度及起始位置偏移删除BLOB中的内容。
DBMS_LOB.ERASE函数原型为:
1 2 3 4
DBMS_LOB.ERASE ( lob_loc IN OUT BLOB, amount IN OUT INTEGER, offset IN INTEGER DEFAULT 1);
表8 DBMS_LOB.ERASE接口参数说明 参数
说明
lob_loc
待删除内容的BLOB类型对象。
amount
待删除的长度。
说明:如果删除长度小于1或删除长度大于BLOB类型最大长度,则报错。
offset
指定从BLOB内容的哪个位置开始删除的偏移(即相对BLOB内容起始位置的字节数)。
说明:如果偏移量小于1或偏移量大于BLOB类型最大长度,则报错。
- DBMS_LOB.CLOSE
存储过程CLOSE根据指定长度及起始位置偏移关闭已经打开的LOB内容。
DBMS_LOB.CLOSE函数原型为:
1 2 3 4 5
DBMS_LOB.CLOSE( src_lob IN BLOB); DBMS_LOB.CLOSE ( src_lob IN CLOB);
- DBMS_LOB.INSTR
该函数返回在LOB中第N次出现的位置,如果输入的是一些无效值会返回NULL值。offset < 1 or offset > LOBMAXSIZE,nth < 1,nth > LOBMAXSIZE。
DBMS_LOB.INSTR函数原型为:
1 2 3 4 5 6 7 8 9 10 11 12 13
DBMS_LOB.INSTR ( lob_loc IN BLOB, pattern IN RAW, offset IN INTEGER := 1, nth IN INTEGER := 1) RETURN INTEGER; DBMS_LOB.INSTR ( lob_loc IN CLOB, pattern IN VARCHAR2 , offset IN INTEGER := 1, nth IN INTEGER := 1) RETURN INTEGER;
表10 DBMS_LOB.INSTR接口参数说明 参数
说明
lob_loc
要查找的LOB描述符。
pattern
要匹配的模式,对于BLOB是由一组RAW类型的数据组成,对于CLOB是由一组text类型的数据组成。
offset
对于BLOB是以字节为单位的绝对偏移量,对于CLOB是以字符为单位的偏移量,模式匹配的起始位置是1。
nth
模式匹配的次数,最小值为1。
- DBMS_LOB.COMPARE
- 如果比较的结果相等返回0,否则返回非零的值。
- 如果第一个CLOB比第二个小,返回-1;如果第一个CLOB比第二个大,返回1。
- 如果amount,offset_1,offset_2这几个参数有无效参数返回NULL,有效的偏移量范围是1~LOBMAXSIZE。
DBMS_LOB.READ函数原型为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
DBMS_LOB.COMPARE ( lob_1 IN BLOB, lob_2 IN BLOB, amount IN INTEGER := DBMS_LOB.LOBMAXSIZE, offset_1 IN INTEGER := 1, offset_2 IN INTEGER := 1) RETURN INTEGER; DBMS_LOB.COMPARE ( lob_1 IN CLOB, lob_2 IN CLOB, amount IN INTEGER := DBMS_LOB.LOBMAXSIZE, offset_1 IN INTEGER := 1, offset_2 IN INTEGER := 1) RETURN INTEGER;
表11 DBMS_LOB.COMPARE接口参数说明 参数
说明
lob_1
第一个要比较的LOB描述符。
lob_2
第二个要比较的LOB描述符。
amount
要比较的字符数或者字节数, 最大值为DBMS_LOB.LOBMAXSIZE。
offset_1
第一个LOB描述符的偏移量,初始位置是1。
offset_2
第二个LOB描述符的偏移量,初始位置是1。
- DBMS_LOB.SUBSTR
用于读取一个LOB的子串,返回读取的字节个数或者字符个数,当amount > 1或者amount < 32767,offset < 1或者offset > LOBMAXSIZE的时候返回值是NULL。
DBMS_LOB.SUBSTR函数原型为:
1 2 3 4 5 6 7 8 9 10 11
DBMS_LOB.SUBSTR ( lob_loc IN BLOB, amount IN INTEGER := 32767, offset IN INTEGER := 1) RETURN RAW; DBMS_LOB.SUBSTR ( lob_loc IN CLOB, amount IN INTEGER := 32767, offset IN INTEGER := 1) RETURN VARCHAR2;
表12 DBMS_LOB.SUBSTR接口参数说明 参数
说明
lob_loc
将要读取子串的LOB描述符,对于BLOB类型的返回值是读取的字节个数,对于CLOB类型的返回值是字符个数。
offset
要读取的字节数或者字符数量。
buffer
从开始位置偏移的字符数或者字节数量。
- DBMS_LOB.TRIM
这个存储过程用于截断指定长度的LOB,执行完这个存储过程会将LOB的长度设置为newlen参数指定的长度。如果对一个空的LOB执行截断操作,不会有任何执行结果;如果指定的长度比LOB的长度长,会产生一个异常。
DBMS_LOB.TRIM函数原型为:
1 2 3 4 5 6 7
DBMS_LOB.TRIM ( lob_loc IN OUT BLOB, newlen IN INTEGER); DBMS_LOB.TRIM ( lob_loc IN OUT CLOB, newlen IN INTEGER);
表13 DBMS_LOB.TRIM接口参数说明 参数
说明
lob_loc
待读入的指定BLOB类型的对象。
newlen
截断后LOB的新长度对于BLOB是字节数,对于CLOB是字符数。
- DBMS_LOB.CREATETEMPORARY
这个存储过程创建一个临时的BLOB或者CLOB,这个存储过程仅用于语法上的兼容,并无实际意义。
DBMS_LOB.CREATETEMPORARY函数原型为:
1 2 3 4 5 6 7 8 9
DBMS_LOB.CREATETEMPORARY ( lob_loc IN OUT BLOB, cache IN BOOLEAN, dur IN INTEGER); DBMS_LOB.CREATETEMPORARY ( lob_loc IN OUT CLOB, cache IN BOOLEAN, dur IN INTEGER);
表14 DBMS_LOB.CREATETEMPORARY接口参数说明 参数
说明
lob_loc
LOB描述符。
cache
仅用于语法上的兼容。
dur
仅用于语法上的兼容。
- DBMS_LOB.APPEND
存储过程READ根据指定长度及起始位置偏移读取BLOB内容的一部分到BUFFER缓冲区。
DBMS_LOB.APPEND函数原型为:
1 2 3 4 5 6 7
DBMS_LOB.APPEND ( dest_lob IN OUT BLOB, src_lob IN BLOB); DBMS_LOB.APPEND ( dest_lob IN OUT CLOB, src_lob IN CLOB);
表15 DBMS_LOB.APPEND接口参数说明 参数
说明
dest_lob
要写入的LOB描述符。
src_lob
读取的LOB描述符。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
--获取字符串的长度
SELECT DBMS_LOB.GETLENGTH('12345678');
DECLARE
myraw RAW(100);
amount INTEGER :=2;
buffer INTEGER :=1;
begin
DBMS_LOB.READ('123456789012345',amount,buffer,myraw);
dbms_output.put_line(myraw);
end;
/
CREATE TABLE blob_Table (t1 blob) DISTRIBUTE BY REPLICATION;
CREATE TABLE blob_Table_bak (t2 blob) DISTRIBUTE BY REPLICATION;
INSERT INTO blob_Table VALUES('abcdef');
INSERT INTO blob_Table_bak VALUES('22222');
DECLARE
str varchar2(100) := 'abcdef';
source raw(100);
dest blob;
copyto blob;
amount int;
PSV_SQL varchar2(100);
PSV_SQL1 varchar2(100);
a int :=1;
len int;
BEGIN
source := utl_raw.cast_to_raw(str);
amount := utl_raw.length(source);
PSV_SQL :='select * from blob_Table for update';
PSV_SQL1 := 'select * from blob_Table_bak for update';
EXECUTE IMMEDIATE PSV_SQL into dest;
EXECUTE IMMEDIATE PSV_SQL1 into copyto;
DBMS_LOB.WRITE(dest, amount, 1, source);
DBMS_LOB.WRITEAPPEND(dest, amount, source);
DBMS_LOB.ERASE(dest, a, 1);
DBMS_OUTPUT.PUT_LINE(a);
DBMS_LOB.COPY(copyto, dest, amount, 10, 1);
DBMS_LOB.CLOSE(dest);
RETURN;
END;
/
--删除表
DROP TABLE blob_Table;
DROP TABLE blob_Table_bak;
|