向数据库中存储以及读取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 存在,说明读取成功。
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 存在,说明读取成功。
相关文章推荐
- 向数据库中存储以及读取BLOB对象
- 向数据库中存储以及读取BLOB对象
- 使用存储过程(PL/SQL)向数据库中存储BLOB对象
- 使用SQLite存储以及读取Drawable对象
- SharePoint 2013 使用 RBS 功能将二进制大型对象 BLOB 存储在内容数据库外部。
- java+mysql实现保存图片到数据库,以及读取数据库存储的图片
- java+pgsql实现保存图片到数据库,以及读取数据库存储的图片
- Asp.net 中图片存储数据库以及页面读取显示通用方法详解-附源码下载
- 上传图片至服务器,写入到数据库Blob字段中,以及从数据库读取Blob信息(iframe父子页面传值)(1)
- MFC/VC++ 怎样将C++对象存储到数据库并读取出来
- 上传图片至服务器,写入到数据库Blob字段中,以及从数据库读取Blob信息(iframe父子页面传值)(2)
- 在oracle 数据库中使用 Blob 字段存储 一张图片并读取
- (一)上传图片至服务器,写入到数据库Blob字段中,以及从数据库读取Blob信息(iframe父子页面传值)
- 关于数据库BLOB类型的存储和读取
- java+mysql实现保存图片到数据库,以及读取数据库存储的图片
- C#利用MySQL的BLOB存储和读取文件和对象
- 从数据库中读取Blob对象图片并显示
- [Android实例] 使用SQLite存储以及读取Drawable对象【转】
- 从数据库中读取Blob对象图片并显示
- Asp.net中图片存储数据库以及页面读取显示通用方法详解