对LOB类型的数据是很特殊的,读取以及存储都与一般的类型不同:
1、存储BLOB类型:
首先需要建一个directory ,用来存放图片的文件夹地址:
create or replace directory BLOBDIR as 'D:/oradata/Pic';
grant read,write on directory BLOBDIR to daimin;
新建表
CREATE TABLE daimin_blob (
fid number,
fname varchar2(50),
fdesc varchar2(200),
fpic BLOB);
create sequence S_daimin_SEQ
start with 1
increment by 1;
创建下面的存储过程:
CREATE OR REPLACE PROCEDURE daimin_load_blob (pfname VARCHAR2,pdesc varchar2)
IS
src_file BFILE;
dst_file BLOB;
lgh_file BINARY_INTEGER;
BEGIN
src_file := bfilename('BLOBDIR', pfname);--读取原文件的内容
INSERT INTO daimin_blob (fid,fname,fdesc,fpic)
VALUES (S_daimin_SEQ.Nextval,pfname,pdesc,EMPTY_BLOB()) --注意BLOB类型的字段在插入操作的时候的 --必须先初始化为EMPTY_BLOB(),再做更新操作更新为自己想插入的内容
RETURNING fpic INTO dst_file;
SELECT fpic INTO dst_file
FROM daimin_blob WHERE fname = pfname FOR UPDATE;
dbms_lob.fileopen(src_file, dbms_lob.file_readonly);
lgh_file := dbms_lob.getlength(src_file);
dbms_lob.loadfromfile(dst_file, src_file, lgh_file); --从文件中向数据库加载图片到BLOB类型的变量
UPDATE daimin_blob SET fpic = dst_file
WHERE fname = pfname; --再作更新操作更新为加载后的内容
dbms_lob.fileclose(src_file);
commit;
END daimin_load_blob;
BEGIN
daimin_load_blob('I_am.gif','ddddd');
enD;
执行上面的语句之后则原来的表中就查看到新加载的文件
select * from daimin_blob;
2、读取BLOB类型:
CREATE OR REPLACE PROCEDURE daimin_dump_blob (piname varchar2,poname varchar2) IS
l_file UTL_FILE.FILE_TYPE;
l_buffer RAW(32767);
l_amount BINARY_INTEGER := 32767;
l_pos INTEGER := 1;
l_blob BLOB;
l_blob_len INTEGER;
BEGIN
SELECT FPIC
INTO l_blob
FROM daimin_blob
WHERE FNAME = piname;
l_blob_len := DBMS_LOB.GETLENGTH(l_blob);
l_file := UTL_FILE.FOPEN('BLOBDIR',poname,'wb', 32767); --以可写模式打开文件并将文件的handle返回
WHILE l_pos < l_blob_len LOOP
DBMS_LOB.READ (l_blob, l_amount, l_pos, l_buffer);--读取文件中的内容,并写到文件中
UTL_FILE.PUT_RAW(l_file, l_buffer, TRUE); --将上面读出到buffer的数据fresh了下
l_pos := l_pos + l_amount;
END LOOP;
UTL_FILE.FCLOSE(l_file);
EXCEPTION
WHEN OTHERS THEN
IF UTL_FILE.IS_OPEN(l_file) THEN
UTL_FILE.FCLOSE(l_file);
END IF;
RAISE;
END;
begin
daimin_dump_blob('I_am.gif','03.jpg');
end;
执行上面的语句,则在'D:/oradata/Pic'文件夹下发现有新的图片'03.jpg'存在,说明读取成功。
上面的学习步骤是按照http://www.eygle.com/archives/2005/04/eoaplsqloeaoeae.html和http://www.eygle.com/archives/2005/04/eoaiplsqlieoeao.html练习了一遍,只是为了方便自己以后查找。这个不是原创。