在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
我考
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>
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) 来验证插入数否成功