📄 insertimage.txt
字号:
Q:请问如何在oracle数据库中存取图片?
_------------------------------------------------------------------------------
怎样用java实现在oracle数据库中进行图片的插入和取得操作?????
字段类型:blob,clob,nclob
说明:三种大型对象(LOB),用来保存较大的图形文件或带格式的文本文件,如
Miceosoft Word文档,以及音频、视频等非文本文件,最大长度是4GB。LOB有几种类型,取决
于你使用的字节的类型,Oracle 8i实实在在地将这些数据存储在数据库内部保存。可以执行
我们所操作的clobtest_table中属性是(字符型id,CLOB型picstr),目前我们假设一个
大的字符对象str已经包含了我们需要存入picstr字段的数据。而且connection对象conn已经
建立。以下的例子程序也因为不想占用太多的空间,所以对抛出异常没有写。大家参考一下
api doc。就可以知道该抛出什么异常了,此处仅仅告诉大家如何去写。
代码:
(1)对数据库clob型执行插入操作
************************************************* T_IMAGE
java.sql.PreparedStatement pstmt = ;
ResultSet rs = ;
conn.setAutoCommit(false);
String sql = "insert into image_lob(T_ID,T_IMAGE) values(?,empty_clob())";
java.sql.PreparedStatement sta = conn.prepareStatement(sql);
sta.setString(1,"001");
sta.executeUpdate();
sta =
sql = "select T_IMAGE from image_lob where T_ID = '001' for
sta = con.prepareStatement(sql)
rs= sta.executesql();
oracle.sql.CLOB clobtt = ;
if(rs.next()){
clobtt = (oracle.sql.CLOB)rs.getClob(1);
}
Writer wr = clobtt.getCharacterOutputStream();
wr.write(strtmp);
wr.flush();
wr.close();
rs.close();
con.commit();
(2)通过sql/plus查询是否已经成功插入数据库
*************************************************
PL/SQL的包DBMS_LOB来处理LOB数据。察看刚才的插入是否成功。使用DBMS_LOB包的
getlength这个procedure来检测是否已经将str存入到T_IMAGE字段中了。如:
SQL> select dbms_lob.getlength(T_IMAGE) from image_lob;
(3)对数据库clob型执行读取操作
*************************************************
读取相对插入就很简单了。基本步骤和一般的取数据库数据没有太大的差别。
String description = ""
sql = "select T_IMAGE from image_lob where T_ID = '001'";
sta = con.prepareStatement(sql);
ResultSet result = sta.executesql();
if(result.next()){
oracle.jdbc.driver.OracleResultSet ors =
(oracle.jdbc.driver.OracleResultSet)result;
oracle.sql.CLOB clobtmp = (oracle.sql.CLOB) ors.getClob(1);
if(clobtmp== || clobtmp.length()==0){
System.out.println("======CLOB对象为空 ");
description = "";
}else{
description=clobtmp.getSubString((long)1,(int)clobtmp.length());
System.out.println("======字符串形式 "+description);
}
}
---------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------
把图片文件数据读入到byte[]中,把byte[]写入数据库中BLOB型字段。
用PreparedStatement 的setObject(int parameterIndex, Object x)方法
可以存入数据库。
读的时候相反,读出byte[],再写入文件中.
create table image(){
filename varchar2(20),
images blob
}
建表:
CREATE TABLE image_lob (T_ID VARCHAR2 (5) NOT NULL,T_IMAGE BLOB NOT NULL);
建目录:
CREATE OR REPLACE DIRECTORY IMAGES AS 'g:\image';
建过程:
CREATE OR REPLACE PROCEDURE IMG_INSERT (TID VARCHAR2,FILENAME VARCHAR2) AS
F_LOB BFILE;
B_LOB BLOB;
BEGIN
INSERT INTO image_lob (T_ID, T_IMAGE) VALUES (TID,EMPTY_BLOB ()) RETURN T_IMAGE INTO B_LOB;
F_LOB:= BFILENAME ('IMAGES', FILENAME);
DBMS_LOB.FILEOPEN (F_LOB, DBMS_LOB.FILE_READONLY);
DBMS_LOB.LOADFROMFILE (B_LOB, F_LOB, DBMS_LOB.GETLENGTH (F_LOB));
DBMS_LOB.FILECLOSE (F_LOB);
COMMIT;
END;
execute img_insert('test','3.jpg');
//读出图片
selectblob fimage into :lb_image from sys_user where fuserid=:i_userid;
if not isnull(lb_image) then
P_1.setpicture(lb_image)
end if
declare
begin
end;
-------------------------------------------------------------------------------------
grant create any directory to scott;
grant create any library to scott;
create or replace directory utllobdir as 'G:\oracle';
create table bfile_tab (bfile_column BFILE);
create table utl_lob_test (blob_column BLOB);
set serveroutput on
然后执行下面语句就将G:\oracle目录下的Azul.jpg存入到utl_lob_test
表中的blob_column字段中了。
declare
a_blob BLOB;
a_bfile BFILE := BFILENAME('UTLLOBDIR','Azul.jpg');
begin
insert into bfile_tab values (a_bfile)
returning bfile_column into a_bfile;
insert into utl_lob_test values (empty_blob())
returning blob_column into a_blob;
dbms_lob.fileopen(a_bfile);
dbms_lob.loadfromfile(a_blob, a_bfile, dbms_lob.getlength(a_bfile));
dbms_lob.fileclose(a_bfile);
commit;
end;
/
select dbms_lob.getlength(blob_column) from UTL_LOB_TEST;
------------------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -