📄 897902.xml
字号:
<?xml version='1.0' encoding='GB2312'?>
<?xml-stylesheet type='text/xsl' href='../csdn.xsl'?>
<Topic>
<Issue>
<PostUserNickName>枫</PostUserNickName>
<rank>二级(初级)</rank>
<ranknum>user2</ranknum>
<credit>100</credit>
<TopicId>897902</TopicId>
<TopicName>求教高手:怎样把从oracle中得到的blob数据写到硬盘???</TopicName>
<PostUserId>248740</PostUserId>
<PostUserName>maple92</PostUserName>
<RoomName>JSP</RoomName>
<ReplyNum>3</ReplyNum>
<PostDateTime>2002-7-24 10:48:50</PostDateTime>
<Point>50</Point>
<ReadNum>0</ReadNum>
<RoomId>28</RoomId>
<EndState>2</EndState>
<Content>如题!</Content>
</Issue>
<Replys>
<Reply>
<PostUserNickName>枫</PostUserNickName>
<rank>二级(初级)</rank>
<ranknum>user2</ranknum>
<credit>100</credit>
<ReplyID>5869114</ReplyID>
<TopicID>897902</TopicID>
<PostUserId>248740</PostUserId>
<PostUserName>maple92</PostUserName>
<Point>0</Point>
<Content>有没有人会?</Content>
<PostDateTime>2002-7-28 16:59:21</PostDateTime>
</Reply>
<Reply>
<PostUserNickName>邮包器</PostUserNickName>
<rank>三级(初级)</rank>
<ranknum>user3</ranknum>
<credit>90</credit>
<ReplyID>5874807</ReplyID>
<TopicID>897902</TopicID>
<PostUserId>167551</PostUserId>
<PostUserName>riyeye</PostUserName>
<Point>50</Point>
<Content>在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字段中去了。
</Content>
<PostDateTime>2002-7-29 8:39:50</PostDateTime>
</Reply>
<Reply>
<PostUserNickName>orion11</PostUserNickName>
<rank>二级(初级)</rank>
<ranknum>user2</ranknum>
<credit>100</credit>
<ReplyID>5876639</ReplyID>
<TopicID>897902</TopicID>
<PostUserId>188210</PostUserId>
<PostUserName>orion11</PostUserName>
<Point>0</Point>
<Content>谢谢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();   
%> 
</Content>
<PostDateTime>2002-7-29 10:19:29</PostDateTime>
</Reply>
</Replys>
</Topic>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -