向数据库中存储以及读取BLOB对象
来源:互联网 发布:标准肌肉身材软件 编辑:程序博客网 时间:2024/05/06 11:57
对LOB类型的数据是很特殊的,读取以及存储都与一般的类型不同:
SQL> select * from all_directories;
OWNER DIRECTORY_NAME DIRECTORY_PATH
------------------------------ ------------------------------ ------------------------------------------------------
SYS BLOBDIR d:\expdb_dirc
SQL> col fdesc format a20;
SQL> col fname format a20;
SQL> select * from daimin_blob ;
FID FNAME FDESC FPIC
---------- -------------------- -------------------- ----
1 lvback.gif ddddd <BLO
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;
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
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
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
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
PL/SQL procedure successfully completed
执行上面的语句,则在 d:\expdb_dirc文件夹下发现有新的图片 03.jpg 存在,说明读取成功。
0 0
- 向数据库中存储以及读取BLOB对象
- 向数据库中存储以及读取BLOB对象
- 通过JDBC向数据库中存储&读取Blob数据
- 使用存储过程(PL/SQL)向数据库中存储BLOB对象
- 使用存储过程(PL/SQL)向数据库中存储BLOB对象
- 使用存储过程(PL/SQL)向数据库中存取BLOB对象——图片
- 使用存储过程向Oracle数据库中插入BLOB文件
- ssh框架向数据库添加blob图片以及在jsp中显示blob图片
- 从数据库中读取Blob对象图片并显示
- 从数据库中读取Blob对象图片并显示
- 从数据库中读取Blob对象图片并显示
- Java从数据库中读取Blob对象图片并显示
- 读取数据库中BLOB字段
- python 向mysql中存储图片以及读取图片
- java读取oracle数据库中blob字段
- 读取数据库中BLOB类型数据文件
- Blob存储读取图片
- Oracle中读取&&存储blob类型存储的图片(待用)
- 如何调用Makefile , enter to directory A and B,then make them
- Oracle多粒度封锁机制研究
- LeetCode_14---Longest Common Prefix
- RFID技术中各频段电子标签的特点及其应用领域
- 第14周 《C++语言基础》程序阅读——标准输入输出对象及文本文件 (2)
- 向数据库中存储以及读取BLOB对象
- 你或许想要用到的三个新的JavaScript API
- 数据包头分析---网络字节序与主机字节序
- C++ string 用法详解(内部实现)
- RabbitMQ Deep Dive (by quqi99)
- HDOJ-3788 ZOJ问题(递推)
- 每日一题G 2015/6/3 16:38
- java double比较大小
- 畅通工程(1863)