oracle lob字段处理

Oracle和plsql都支持lob(large object) 类型,用来存储大数量数据,如图像文件,声音文件等。Oracle 9i realse2支持存储最大为4g的数据,oracle 10g realse1支持最大8到128万亿字节的数据存储,依赖于你的db的block size。
在plsql中可以申明的lob类型的变量如下:
BFILE        二进制文件,存储在数据库外的操作系统文件,只读的。把此文件当二进制处理。
BLOB        二进制大对象。存储在数据库里的大对象,一般是图像声音等文件。
CLOB        字符型大对象。一般存储大数量文本信息。存储单字节,固定宽度的数据。
NCLOB      字节字符大对象。存储单字节大块,多字节固定宽度,多字节变宽度数据。
Oracle将lob分类为两种:
1.存储在数据库里的,参与数据库的事务。BLOB,CLOB,NCCLOB。
2.存储在数据库外的BFILE,不参与数据库的事务,也就是不能rollback或commit等,它依赖于文件系统的数据完整性。
模拟插入更新.....
SQL> create table testlob(
  
2  id integer,
  
3  content blob);

表已创建。

SQL
> create sequence seq_ad_id start with 1
  
2  maxvalue 999999999999
  
3  nocycle;

序列已创建。


SQL
> insert into testlob values(seq_ad_id.nextval,utl_raw.cast_to_raw('我考'));

已创建 
1 行。

SQL
> commit;

提交完成。

SQL
> 
SQL
> select id,utl_raw.cast_to_varchar2(content) from testlob;

        ID
----------
UTL_RAW.CAST_TO_VARCHAR2(CONTENT)
--------------------------------------------------------------------------------
         3
我考

这里使用了utl_raw的两个过程utl_raw.cast_to_raw()和cast_to_varchar2()来插入查询blob字段数据
对于clob和nclob类型,可以通过to_char()来查询
测试将外部文件插入BLOB。
连接到: 
Oracle 
Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL
> CREATE OR REPLACE PROCEDURE insert_blob(p_filename varchar2IS
  
2    i_blob BLOB;
  
3    i_file BFILE := BFILENAME('UTL_DIR',p_filename);
  
4  BEGIN
  
5    INSERT INTO testlob (a)VALUES (EMPTY_BLOB())
  
6    RETURNING a INTO i_blob;
  
7  
  
8    DBMS_LOB.FILEOPEN(i_file);
  
9    DBMS_LOB.LOADFROMFILE(i_blob, i_file, DBMS_LOB.GETLENGTH(i_file));
 
10    DBMS_LOB.FILECLOSE(i_file);
 
11  
 
12    COMMIT;
 
13  END;
 
14  /

过程已创建。

SQL
> create or replace directory utl_dir as 'E:\oracle\oracle10g';

目录已创建。

SQL
> 
SQL
> grant read,write on directory utl_dir to public;

授权成功。

SQL
> exec insert_blob('第 10 章:监控和调整数据库.pdf');

PL
/SQL 过程已成功完成。

SQL
> SELECT DBMS_LOB.GETLENGTH(a) from testlob;

DBMS_LOB.GETLENGTH(A)
---------------------
                    4
              
2020742
              
4872578

SQL
>

使用 DBMS_LOB.GETLENGTH(a) 来验证插入数否成功
原文地址:https://www.cnblogs.com/zeromyth/p/1574439.html