求sql语句,如何把图片写到oracle数据库中啊。 保存图片数据要用BLOB类型,使用PL/SQL语句进行存取。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 转载一帖:----------------------------------------------------------------------首先建立测试数据表 drop table filelist; commit; CREATE TABLE SYSTEM.FILELIST ( "FILENAME" VARCHAR2(50) NOT NULL, "FILESIZE" NUMBER(20) NULL, "FILEBODY" BLOB NULL, PRIMARY KEY("FILENAME"), UNIQUE("FILENAME")) ; commit; 测试过程,首先将硬盘文件读入数据库,然后再读出到硬盘的另一个新文件里,原码如下:/*** @author 秋南(Ryan)* @email [email protected]* @version 2002 1 14*/import java.io.*;import java.util.*;import java.sql.*;import oracle.sql.*;import oracle.jdbc.driver.*;import java.text.*;public class test{ public static void main(String args[]) throws java.io.IOException,java.sql.SQLException { dbBean db1=new dbBean(); /** *这里是我的数据联接Bean *大家可以用自己的连接Bean */ byte a[]=null;//**将测试文件test.doc读入此字节数组 java.io.FileInputStream fin=null; java.io.FileOutputStream fout=null; oracle.jdbc.OracleResultSet ors=null;//**这里rs一定要用Oracle提供的 oracle.jdbc.driver.OraclePreparedStatement opst=null;//**PreparedStatement用 //Oracle提供的 try { java.io.File f1=new java.io.File("c:/temp/test.doc"); java.io.File f2=new java.io.File("c:/temp/testout.doc");//**从BLOB读出的信息写 //入该文 件,和源文件对比测试用 fin=new java.io.FileInputStream(f1); fout=new java.io.FileOutputStream(f2); int flength=(int)f1.length();//**读入文件的字节长度 System.out.println("file length::"+flength); a=new byte[flength]; int i=0;int itotal=0; /**将文件读入字节数组 for (;itotal<flength;itotal=i+itotal ) { i=fin.read(a,itotal,flength-itotal); } fin.close(); System.out.println("read itotal::"+itotal); /**注意Oracle的 BLOB一定要用EMPTY_BLOB()初始化 String mysql="insert into filelist (FileName,FileSize,FileBody) values (?,?,EMPTY_BLOB())"; opst=(oracle.jdbc.driver.OraclePreparedStatement)db1.conn.prepareStatement(mysql); opst.setString(1,"wordtemplate"); opst.setInt (2,flength); opst.executeUpdate(); opst.clearParameters(); /**插入其它数据后,定位BLOB字段 mysql="select filebody from filelist where filename=?"; opst=(oracle.jdbc.driver.OraclePreparedStatement)db1.conn.prepareStatement(mysql); opst.setString(1,"wordtemplate"); ors=(oracle.jdbc.OracleResultSet)opst.executeQuery(); if (ors.next()) { oracle.sql.BLOB blob=ors.getBLOB(1);/**得到BLOB字段 int j=blob.putBytes(1,a);/**将字节数组写入BLOB字段 System.out.println("j:"+j); db1.conn.commit(); ors.close(); } System.out.println("insert into ok"); byte b[]=null;/**保存从BLOB读出的字节 opst.clearParameters(); mysql="select filebody from filelist where filename=?"; opst=(oracle.jdbc.driver.OraclePreparedStatement)db1.conn.prepareStatement(mysql); opst.setString(1,"wordtemplate"); ors=(oracle.jdbc.OracleResultSet)opst.executeQuery(); if (ors.next()) { oracle.sql.BLOB blob2=ors.getBLOB(1); System.out.println("blob2 length:"+blob2.length()); b=blob2.getBytes(1,flength);/**从BLOB取出字节流数据 System.out.println("b length::"+b.length); db1.conn.commit(); } ors.close(); /**将从BLOB读出的字节写入文件 fout.write(b,0,b.length); fout.close(); System.out.println("write itotal::"+b.length); } catch(Exception e) { System.out.println("errror :"+e.toString() ); e.printStackTrace(); } finally { /**关闭所有数据联接 stmt.close(); db1.closeConn(); } }} 编译运行在TomCat下调试通过。 需要注意的是Blob存取的过程,一般先存入和BLOB相关的控制数据,如文件的名字, 然后查询定位BLOB字段,利用OracleBlob提供的方法: public int putBytes(long pos,byte bytes[]) public byte[] getBytes(long pos,byte bytes[]) 或者利用 public OutputStream getBinaryOutputStream() throws SQLException public InputStream getBinaryStream() throws SQLException 因为利用输入输出流总归还是利用到字节数组缓冲流,所以就不举例子了。 把字段设置成为blob,用输入输出流写入和读取 rant create any directory to scott;grant create any library to scott;create or replace directory utllobdir as 'd:\oracle';create table bfile_tab (bfile_column BFILE);create table utl_lob_test (blob_column BLOB);set serveroutput on然后执行下面语句就将d:\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;/ 数据库设计问题 oracle中如何查看事务未提交 关于删除重复行的问题 新手求一句sql语句,在线= 关于 cursor 失效得问题 如何查ORACLE9I的当前连接数? 2个query的问题 我想不出来 大家来看看 有关外连接 p4装oracle8.1.6为什么装不上,是不是要打补丁,该在哪打 sql 提取前一日数据和每月1日的数据 instead of 触发器问题 如何判断 是应用程序须改的还是触发器修改的
----------------------------------------------------------------------
首先建立测试数据表
drop table filelist;
commit;
CREATE TABLE SYSTEM.FILELIST (
"FILENAME" VARCHAR2(50) NOT NULL,
"FILESIZE" NUMBER(20) NULL,
"FILEBODY" BLOB NULL,
PRIMARY KEY("FILENAME"), UNIQUE("FILENAME")) ;
commit;
测试过程,首先将硬盘文件读入数据库,然后再读出到硬盘的另一个新文件里,原码如下:
/**
* @author 秋南(Ryan)
* @email [email protected]
* @version 2002 1 14
*/
import java.io.*;
import java.util.*;
import java.sql.*;
import oracle.sql.*;
import oracle.jdbc.driver.*;
import java.text.*;public class test
{
public static void main(String args[]) throws java.io.IOException,java.sql.SQLException
{
dbBean db1=new dbBean();
/**
*这里是我的数据联接Bean
*大家可以用自己的连接Bean
*/
byte a[]=null;//**将测试文件test.doc读入此字节数组
java.io.FileInputStream fin=null;
java.io.FileOutputStream fout=null;
oracle.jdbc.OracleResultSet ors=null;//**这里rs一定要用Oracle提供的
oracle.jdbc.driver.OraclePreparedStatement opst=null;//**PreparedStatement用 //Oracle提供的
try
{
java.io.File f1=new java.io.File("c:/temp/test.doc");
java.io.File f2=new java.io.File("c:/temp/testout.doc");//**从BLOB读出的信息写 //入该文 件,和源文件对比测试用
fin=new java.io.FileInputStream(f1);
fout=new java.io.FileOutputStream(f2);
int flength=(int)f1.length();//**读入文件的字节长度
System.out.println("file length::"+flength);
a=new byte[flength];
int i=0;int itotal=0;
/**将文件读入字节数组
for (;itotal<flength;itotal=i+itotal )
{
i=fin.read(a,itotal,flength-itotal);
}
fin.close();
System.out.println("read itotal::"+itotal);
/**注意Oracle的 BLOB一定要用EMPTY_BLOB()初始化
String mysql="insert into filelist (FileName,FileSize,FileBody) values (?,?,EMPTY_BLOB())";
opst=(oracle.jdbc.driver.OraclePreparedStatement)db1.conn.prepareStatement(mysql);
opst.setString(1,"wordtemplate");
opst.setInt (2,flength);
opst.executeUpdate();
opst.clearParameters();
/**插入其它数据后,定位BLOB字段
mysql="select filebody from filelist where filename=?";
opst=(oracle.jdbc.driver.OraclePreparedStatement)db1.conn.prepareStatement(mysql);
opst.setString(1,"wordtemplate");
ors=(oracle.jdbc.OracleResultSet)opst.executeQuery();
if (ors.next())
{
oracle.sql.BLOB blob=ors.getBLOB(1);/**得到BLOB字段
int j=blob.putBytes(1,a);/**将字节数组写入BLOB字段
System.out.println("j:"+j);
db1.conn.commit();
ors.close();
}
System.out.println("insert into ok");
byte b[]=null;/**保存从BLOB读出的字节
opst.clearParameters();
mysql="select filebody from filelist where filename=?";
opst=(oracle.jdbc.driver.OraclePreparedStatement)db1.conn.prepareStatement(mysql);
opst.setString(1,"wordtemplate");
ors=(oracle.jdbc.OracleResultSet)opst.executeQuery();
if (ors.next())
{
oracle.sql.BLOB blob2=ors.getBLOB(1);
System.out.println("blob2 length:"+blob2.length());
b=blob2.getBytes(1,flength);/**从BLOB取出字节流数据
System.out.println("b length::"+b.length);
db1.conn.commit();
}
ors.close();
/**将从BLOB读出的字节写入文件
fout.write(b,0,b.length);
fout.close();
System.out.println("write itotal::"+b.length);
}
catch(Exception e)
{
System.out.println("errror :"+e.toString() );
e.printStackTrace();
}
finally
{ /**关闭所有数据联接
stmt.close();
db1.closeConn();
}
}
}
编译运行在TomCat下调试通过。
需要注意的是Blob存取的过程,一般先存入和BLOB相关的控制数据,如文件的名字,
然后查询定位BLOB字段,利用OracleBlob提供的方法:
public int putBytes(long pos,byte bytes[])
public byte[] getBytes(long pos,byte bytes[])
或者利用
public OutputStream getBinaryOutputStream() throws SQLException
public InputStream getBinaryStream() throws SQLException
因为利用输入输出流总归还是利用到字节数组缓冲流,所以就不举例子了。
grant create any library to scott;
create or replace directory utllobdir as 'd:\oracle';
create table bfile_tab (bfile_column BFILE);
create table utl_lob_test (blob_column BLOB);set serveroutput on然后执行下面语句就将d:\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;
/