⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 insertimage.txt

📁 使用此类可以很方便的与ORACLE数据库进行连接
💻 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 + -