您的位置:首页 > 数据库

向数据库中存储以及读取BLOB对象

2010-04-14 17:13 399 查看
对LOB类型的数据是很特殊的,读取以及存储都与一般的类型不同:

1、存储BLOB类型:
首先需要建一个directory ,用来存放图片的文件夹地址:

SQL> select * from all_directories;

OWNER DIRECTORY_NAME DIRECTORY_PATH
------------------------------ ------------------------------ ------------------------------------------------------
SYS BLOBDIR d:\expdb_dirc

新建表
SQL> CREATE TABLE daimin_blob (
2 fid number,
3 fname varchar2(50),
4 fdesc varchar2(200),
5 fpic BLOB);

Table created

SQL>
SQL> create sequence S_daimin_SEQ
2 start with 1
3 increment by 1
4 /

Sequence created

创建下面的存储过程:
-创建一个读入文件的过程。
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
SQL> exec daimin_load_blob( 'lvback.gif' , 'ddddd' );

PL/SQL procedure successfully completed

SQL> col fdesc format a20;
SQL> col fname format a20;
SQL> select * from daimin_blob ;

FID FNAME FDESC FPIC
---------- -------------------- -------------------- ----
1 lvback.gif ddddd <BLO

读取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;

SQL> exec daimin_dump_blob('lvback.gif','03.jpg');

PL/SQL procedure successfully completed

执行上面的语句,则在 d:\expdb_dirc文件夹下发现有新的图片 03.jpg 存在,说明读取成功。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: