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  varchar2 IS
  
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) 来验证插入数否成功

你可能感兴趣的:(oracle)