在Oracle 8i的SQL*Plus中如何利用LOB字段存取操作系统二进制文件
Oracle 8i数据库系统功能比前面版本更加完善,尤其是出现了BLOB,CLOB,NCLOB,
BFILE这些LOB(大型对象)类型来取代功能有限的LONG、LONGRAW类型。BLOB字段最
大长度为4G(4,294,967,295)字节,而且不再象LONGRAW那样每个表中只是限制有一
个字段是LONGRAW(最长2G)型的。BLOB,CLOB,NCLOB为内部BLOB(数据通常在数据
库中存放),BFILE为外部LOB(所存储的只是指向外部操作系统文件的指针),用户可
以使用PL/SQL的包DBMS_LOB来处理LOB数据,但是遗憾的是,DBMS_LOB包只能将二进
制操作系统文件写入到BLOB字段中,却无法将BLOB字段中的二进制操作系统文件取回
到操作系统中,估计将来会有所改善。本文将就如何在SQL*Plus将WORD文件存入取出
ORACLE中作详细解释说明,供各位同行参考。在internal这个用户下给scott用户授权如下:
SQL>grant create any directory to scott;
SQL>grant create any library to scott;
在scott这个用户下执行下述语句:SQL>create table bfile_tab (bfile_column BFILE);
SQL>create table utl_lob_test (blob_column BLOB);
SQL>create or replace directory utllobdir as 'C:\DDS\EXTPROC';
SQL>set serveroutput on然后执行下面语句就将C:\DDS\EXTPROC目录下的word文件COM.doc存入到utl_lob_test 
表中的blob_column字段中了。declare
   a_blob  BLOB;
   a_bfile BFILE := BFILENAME('UTLLOBDIR','COM.doc'); --用来指向外部操作系统文件
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;
/
SQL>show errors
此时可以使用DBMS_LOB包的getlength这个procedure来检测是否已经将该word文件存入
到blob字段中了。如:
SQL> select dbms_lob.getlength(blob_column) from UTL_LOB_TEST;
结果如下:
DBMS_LOB.GETLENGTH(BLOB_COLUMN)
-------------------------------
                83968
说明该word文件已经存入到blob字段中去了。

解决方案 »

  1.   

    谢谢riyeye(邮包器),我长见识了!下面是一段JSP代码
     <%@ page language="java" import="java.sql.*,java.util.*"%>
    <%@ page language="java" import="oracle.sql.*"%>
    <%
       String image_id ="1";
       Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();   
       String url="jdbc:oracle:thin:@172.18.16.68:1521:rz817"; 
       //orcl为你的数据库的SID 
       String user="hr_system"; 
       String password="manager"; 
       Connection conn= DriverManager.getConnection(url,user,password);   
       Statement stmt = conn.createStatement();
       ResultSet rs = stmt.executeQuery("SELECT * FROM tfile WHERE id = " + image_id);  
       java.io.File fileout=new java.io.File("e:/img.jpg");
       FileOutputStream op = new FileOutputStream(fileout);
       int length = 0;
       
       if (rs.next()){
            String dim_image = rs.getString("filename");       
            BLOB blocco = (BLOB)rs.getObject("info"); 
            length = (int)blocco.length();       
            byte [] byte_array  = blocco.getBytes(1, length);
            for(int i=0;i<byte_array.length;i++)
         {
         op.write(byte_array[i]);
         }
         /*
            for(int i=0;i<blocco.length;i++){
                op.write(blocco[i]);
            }
           */
       } 
       op.close() ;   
       
       rs.close();
       stmt.close();
       conn.close();   
    %>