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

📄 897902.xml

📁 论坛精华帖子
💻 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&#32;8i的SQL*Plus中如何利用LOB字段存取操作系统二进制文件
Oracle&#32;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&gt;grant&#32;create&#32;any&#32;directory&#32;to&#32;scott;
SQL&gt;grant&#32;create&#32;any&#32;library&#32;to&#32;scott;
在scott这个用户下执行下述语句:

SQL&gt;create&#32;table&#32;bfile_tab&#32;(bfile_column&#32;BFILE);
SQL&gt;create&#32;table&#32;utl_lob_test&#32;(blob_column&#32;BLOB);
SQL&gt;create&#32;or&#32;replace&#32;directory&#32;utllobdir&#32;as&#32;'C:\DDS\EXTPROC';
SQL&gt;set&#32;serveroutput&#32;on

然后执行下面语句就将C:\DDS\EXTPROC目录下的word文件COM.doc存入到utl_lob_test&#32;
表中的blob_column字段中了。

declare
&#32;&#32;&#32;a_blob&#32;&#32;BLOB;
&#32;&#32;&#32;a_bfile&#32;BFILE&#32;:=&#32;BFILENAME('UTLLOBDIR','COM.doc');&#32;--用来指向外部操作系统

文件
begin
&#32;&#32;&#32;insert&#32;into&#32;bfile_tab&#32;values&#32;(a_bfile)
&#32;&#32;&#32;&#32;&#32;returning&#32;bfile_column&#32;into&#32;a_bfile;
&#32;&#32;&#32;insert&#32;into&#32;utl_lob_test&#32;values&#32;(empty_blob())
&#32;&#32;&#32;&#32;&#32;returning&#32;blob_column&#32;into&#32;a_blob;
&#32;&#32;&#32;dbms_lob.fileopen(a_bfile);
&#32;&#32;&#32;dbms_lob.loadfromfile(a_blob,&#32;a_bfile,&#32;dbms_lob.getlength(a_bfile));
&#32;&#32;&#32;dbms_lob.fileclose(a_bfile);
&#32;&#32;&#32;commit;
end;
/
SQL&gt;show&#32;errors
此时可以使用DBMS_LOB包的getlength这个procedure来检测是否已经将该word文件存入
到blob字段中了。如:
SQL&gt;&#32;select&#32;dbms_lob.getlength(blob_column)&#32;from&#32;UTL_LOB_TEST;
结果如下:
DBMS_LOB.GETLENGTH(BLOB_COLUMN)
-------------------------------
&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;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代码
&#32;&lt;%@&#32;page&#32;language="java"&#32;import="java.sql.*,java.util.*"%&gt;
&lt;%@&#32;page&#32;language="java"&#32;import="oracle.sql.*"%&gt;
&lt;%
&#32;&#32;&#32;String&#32;image_id&#32;="1";
&#32;&#32;&#32;Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();&#32;&#32;&#32;
&#32;&#32;&#32;String&#32;url="jdbc:oracle:thin:@172.18.16.68:1521:rz817";&#32;
&#32;&#32;&#32;//orcl为你的数据库的SID&#32;
&#32;&#32;&#32;String&#32;user="hr_system";&#32;
&#32;&#32;&#32;String&#32;password="manager";&#32;
&#32;&#32;&#32;Connection&#32;conn=&#32;DriverManager.getConnection(url,user,password);&#32;&#32;&#32;
&#32;&#32;&#32;Statement&#32;stmt&#32;=&#32;conn.createStatement();
&#32;&#32;&#32;ResultSet&#32;rs&#32;=&#32;stmt.executeQuery("SELECT&#32;*&#32;FROM&#32;tfile&#32;WHERE&#32;id&#32;=&#32;"&#32;+&#32;image_id);&#32;&#32;
&#32;&#32;&#32;java.io.File&#32;fileout=new&#32;java.io.File("e:/img.jpg");
&#32;&#32;&#32;FileOutputStream&#32;op&#32;=&#32;new&#32;FileOutputStream(fileout);
&#32;&#32;&#32;int&#32;length&#32;=&#32;0;
&#32;&#32;&#32;
&#32;&#32;&#32;if&#32;(rs.next()){
&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#9;String&#32;dim_image&#32;=&#32;rs.getString("filename");&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#9;
&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#9;BLOB&#32;blocco&#32;=&#32;(BLOB)rs.getObject("info");&#32;
&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#9;length&#32;=&#32;(int)blocco.length();&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#9;&#9;&#9;
&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#9;byte&#32;[]&#32;byte_array&#32;&#32;=&#32;blocco.getBytes(1,&#32;length);
&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#9;for(int&#32;i=0;i&lt;byte_array.length;i++)
&#32;&#32;&#32;&#32;&#9;{
&#32;&#32;&#32;&#32;&#9;&#9;op.write(byte_array[i]);
&#32;&#32;&#32;&#32;&#9;}
&#32;&#32;&#32;&#32;&#32;/*
&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#9;for(int&#32;i=0;i&lt;blocco.length;i++){
&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;op.write(blocco[i]);
&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;}
&#32;&#32;&#32;&#32;&#32;&#32;&#32;*/
&#32;&#32;&#32;}&#32;
&#32;&#32;&#32;op.close()&#32;;&#32;&#32;&#32;
&#32;&#32;&#32;
&#32;&#32;&#32;rs.close();
&#32;&#32;&#32;stmt.close();
&#32;&#32;&#32;conn.close();&#32;&#32;&#32;
%&gt;&#32;
</Content>
<PostDateTime>2002-7-29 10:19:29</PostDateTime>
</Reply>
</Replys>
</Topic>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -