
# DBMS_LOB
#### 接口介绍
高级功能包DBMS_LOB支持的所有接口请参见[表1]。
 表1DBMS_LOB 
| 接口名称                                                                                     | 描述                                        |
|:---|:---|
| [DBMS_LOB.GETLENGTH]   | 获取并返回指定的LOB类型对象的长度。                       |
| [DBMS_LOB.OPEN]                          | 打开一个LOB返回一个LOB的描述符。                       |
| [DBMS_LOB.READ]        | 根据指定的长度及起始位置偏移读取LOB内容的一部分到BUFFER缓冲区。      |
| [DBMS_LOB.WRITE]       | 根据指定长度及起始位置偏移将BUFFER中内容写入到LOB中。           |
| [DBMS_LOB.WRITEAPPEND] | 根据指定长度将BUFFER中内容写入到LOB的尾部。                |
| [DBMS_LOB.COPY]        | 根据指定长度及起始位置偏移将BLOB内容写入到另一个BLOB中。          |
| [DBMS_LOB.ERASE]       | 根据指定长度及起始位置偏移删除BLOB中的内容。                  |
| [DBMS_LOB.CLOSE]       | 关闭已经打开的LOB描述符。                            |
| [DBMS_LOB.INSTR]                         | 返回一个字符串在LOB中第N次出现的位置。                     |
| [DBMS_LOB.COMPARE]                      | 比较两个LOB或者两个LOB的某一部分。                      |
| [DBMS_LOB.SUBSTR]                         | 用于读取一个LOB的子串，返回读取的字节个数或者字符个数。             |
| [DBMS_LOB.TRIM]                           | 用于截断指定长度的LOB，执行完会将LOB的长度设置为newlen参数指定的长度。 |
| [DBMS_LOB.CREATETEMPORARY]                | 创建一个临时的BLOB或者CLOB。                        |
| [DBMS_LOB.APPEND]                         | 将原LOB的内容拼接到目的LOB中。                        |
   
- DBMS_LOB.GETLENGTH
  存储过程GETLENGTH获取并返回指定的LOB类型对象的长度。
  DBMS_LOB.GETLENGTH函数原型为：
  ```
  DBMS_LOB.GETLENGTH (
  lob_loc    IN   BLOB)
  RETURN INTEGER;
  DBMS_LOB.GETLENGTH (
  lob_loc    IN   CLOB)
  RETURN INTEGER;
  ```
  表2DBMS_LOB.GETLENGTH接口参数说明 
  | 参数      | 描述                 |
  |:---|:---|
  | lob_loc | 待获取长度的指定的LOB类型的对象。 |
     
  
- DBMS_LOB.OPEN
  存储过程打开一个LOB，并返回一个LOB描述符，该过程无实际意义，仅用于兼容。
  DBMS_LOB.OPEN函数原型为：
  ```
  DBMS_LOB.LOB (
  lob_loc    INOUT   BLOB,
  open_mode IN BINARY_INTEGER);
  DBMS_LOB.LOB (
  lob_loc  INOUT    CLOB,
  open_mode IN BINARY_INTEGER);
  ```
  表3DBMS_LOB.OPEN接口参数说明 
  | 参数                          | 描述                               |
  |:---|:---|
  | lob_loc                     | 被打开的一个BLOB或者CLOB描述符。             |
  | open_mode IN BINARY_INTEGER | 打开的模式，目前支持DBMS_LOB.LOB_READWRITE |
     
  
- DBMS_LOB.READ
  存储过程READ根据指定长度及起始位置偏移读取LOB内容的一部分到BUFFER缓冲区。
  DBMS_LOB.READ函数原型为：
  ```
  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);
  ```
  表4DBMS_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函数原型为：
  ```
  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);
  ```
  表5DBMS_LOB.WRITE接口参数说明 
  | 参数      | 说明                                                                                                                                                                                                           |
  |:---|:---|
  | lob_loc | 待写入的指定的LOB类型的对象。                                                                                                                                                                                             |
  | amount  | 写入长度。 说明： 如果写入长度小于1或写入长度大于待写入的内容长度，则报错。                                  |
  | offset  | 指定从LOB内容的哪个位置开始写入的偏移（即相对LOB内容起始位置的字节数）。 说明： 如果偏移量小于1或偏移量大于LOB类型最大长度，则报错。 |
  | buffer  | 待写入的内容。                                                                                                                                                                                                      |
     
  
- DBMS_LOB.WRITEAPPEND
  存储过程WRITEAPPEND根据指定长度将BUFFER中内容写入到LOB的尾部。
  DBMS_LOB.WRITEAPPEND函数原型为：
  ```
  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);
  ```
  表6DBMS_LOB.WRITEAPPEND接口参数说明 
  | 参数      | 说明                                                                                                                                                                          |
  |:---|:---|
  | lob_loc | 待写入的指定的LOB类型的对象。                                                                                                                                                            |
  | amount  | 写入长度。 说明： 如果写入长度小于1或写入长度大于待写入的内容长度，则报错。 |
  | buffer  | 待写入的内容。                                                                                                                                                                     |
     
  
- DBMS_LOB.COPY
  存储过程COPY根据指定长度及起始位置偏移将BLOB内容复制到另一个BLOB中。
  DBMS_LOB.COPY函数原型为：
  ```
  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);
  ```
  表7DBMS_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函数原型为：
  ```
  DBMS_LOB.ERASE (
  lob_loc          IN OUT   BLOB,
  amount           IN OUT   INTEGER,
  offset           IN       INTEGER DEFAULT 1);
  ```
  表8DBMS_LOB.ERASE接口参数说明 
  | 参数      | 说明                                                                                                                                                                                                              |
  |:---|:---|
  | lob_loc | 待删除内容的BLOB类型对象。                                                                                                                                                                                                 |
  | amount  | 待删除的长度。 说明： 如果删除长度小于1或删除长度大于BLOB类型最大长度，则报错。                                 |
  | offset  | 指定从BLOB内容的哪个位置开始删除的偏移（即相对BLOB内容起始位置的字节数）。 说明： 如果偏移量小于1或偏移量大于BLOB类型最大长度，则报错。 |
     
  
- DBMS_LOB.CLOSE 存储过程CLOSE根据指定长度及起始位置偏移关闭已经打开的LOB内容。
  DBMS_LOB.CLOSE函数原型为：
  ```
  DBMS_LOB.CLOSE(
  src_lob       IN              BLOB);
  DBMS_LOB.CLOSE (
  src_lob      IN               CLOB);
  ```
   表9DBMS_LOB.CLOSE接口参数说明 
  | 参数      | 说明           |
  |:---|:---|
  | src_loc | 待关闭的LOB类型对象。 |
     
  
- DBMS_LOB.INSTR
  该函数返回在LOB中第N次出现的位置，如果输入的是一些无效值会返回NULL值。offset \< 1 or offset \> LOBMAXSIZE，nth \< 1，nth \> LOBMAXSIZE。
  DBMS_LOB.INSTR函数原型为：
  ```
  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;
  ```
  表10DBMS_LOB.INSTR接口参数说明 
  | 参数      | 说明                                                 |
  |:---|:---|
  | lob_loc | 要查找的LOB描述符。                                        |
  | pattern | 要匹配的模式，对于BLOB是由一组RAW类型的数据组成，对于CLOB是由一组text类型的数据组成。 |
  | offset  | 对于BLOB是以字节为单位的绝对偏移量，对于CLOB是以字符为单位的偏移量，模式匹配的起始位置是1。 |
  | nth     | 模式匹配的次数，最小值为1。                                     |
     
  
- DBMS_LOB.COMPARE
  这个函数比较两个LOB或者两个LOB的一部分。
  - 如果比较的结果相等返回0，否则返回非零的值。
  
  - 如果第一个CLOB比第二个小，返回-1；如果第一个CLOB比第二个大，返回1。
  
  - 如果amount，offset_1，offset_2这几个参数有无效参数返回NULL，有效的偏移量范围是1\~LOBMAXSIZE。
  
  
  DBMS_LOB.READ函数原型为：
  ```
  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;
  ```
  表11DBMS_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函数原型为：
  ```
  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;
  ```
  表12DBMS_LOB.SUBSTR接口参数说明 
  | 参数      | 说明                                                    |
  |:---|:---|
  | lob_loc | 将要读取子串的LOB描述符，对于BLOB类型的返回值是读取的字节个数，对于CLOB类型的返回值是字符个数。 |
  | offset  | 要读取的字节数或者字符数量。                                        |
  | buffer  | 从开始位置偏移的字符数或者字节数量。                                    |
     
  
- DBMS_LOB.TRIM
  这个存储过程用于截断指定长度的LOB，执行完这个存储过程会将LOB的长度设置为newlen参数指定的长度。如果对一个空的LOB执行截断操作，不会有任何执行结果；如果指定的长度比LOB的长度长，会产生一个异常。
  DBMS_LOB.TRIM函数原型为：
  ```
  DBMS_LOB.TRIM (
  lob_loc     IN OUT     BLOB,
  newlen      IN         INTEGER);
  DBMS_LOB.TRIM (
  lob_loc    IN          OUT CLOB,
  newlen     IN          INTEGER);
  ```
  表13DBMS_LOB.TRIM接口参数说明 
  | 参数      | 说明                               |
  |:---|:---|
  | lob_loc | 待读入的指定BLOB类型的对象。                 |
  | newlen  | 截断后LOB的新长度对于BLOB是字节数，对于CLOB是字符数。 |
     
  
- DBMS_LOB.CREATETEMPORARY
  这个存储过程创建一个临时的BLOB或者CLOB，这个存储过程仅用于语法上的兼容，并无实际意义。
  DBMS_LOB.CREATETEMPORARY函数原型为：
  ```
  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);
  ```
  表14DBMS_LOB.CREATETEMPORARY接口参数说明 
  | 参数      | 说明         |
  |:---|:---|
  | lob_loc | LOB描述符。    |
  | cache   | 仅用于语法上的兼容。 |
  | dur     | 仅用于语法上的兼容。 |
     
  
- DBMS_LOB.APPEND
  存储过程READ根据指定长度及起始位置偏移读取BLOB内容的一部分到BUFFER缓冲区。
  DBMS_LOB.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);
  ```
  表15DBMS_LOB.APPEND接口参数说明 
  | 参数       | 说明          |
  |:---|:---|
  | dest_lob | 要写入的LOB描述符。 |
  | src_lob  | 读取的LOB描述符。  |
     
  
 
#### 示例
```
--获取字符串的长度
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;
```
