用oracle的java存储过程实现BLOB字段的字符串读取

来源:互联网 发布:linux查看网络配置 编辑:程序博客网 时间:2024/06/05 04:20

原创于2009年07月24日,2009年10月22日迁移至此。


阅读了一个帖子“有没有可能写出比Oracle函数更快的外部存储过程”(http://www.itpub.net/thread-1117461-1-1.html)
突发灵感,加上原来有一个需求,需要从BLOB字段(本来就是字符型的内容)中直接读取成为字符串,需要java开发人员的支持,想了想与其求人不如求己,
oracle.sql.BLOB的相关文档参看(http://www.princeton.edu/~storacle/jdbc8_doc/oracle.sql.BLOB.html)

java能够调用Oracle的存储过程,反之oracle也能用java来开发外部存储过程,这样java和oracle的相互界限就已经不明确了。
当然关系型数据库最好做自己应该做的事情而不是大包大揽做所有的非数据库应该做的事情。

--开发java类
create or replace and compile java source named BLOBObject as
package MyOracle.BLOB;             --自己定义的package
import java.io.*;                          --外部引用到的java包
import oracle.sql.*;
public class BLOBObject
{
public static String ConvertBLOBtoString(oracle.sql.BLOB BlobContent)
{
   byte[] msgContent= BlobContent.getBytes(); //BLOB转换为字节数组

   byte[] bytes;       //BLOB临时存储字节数组
   String newStr = ""; //返回字符串
   int i=1;            //循环变量
   long BlobLength;    //BLOB字段长度
   try      
   {
     BlobLength=BlobContent.length();  //获取BLOB长度
     if (msgContent == null || BlobLength==0)  //如果为空,返回空值
     {
       return "";
     }
     else                              //处理BLOB为字符串
    {
       /*
       while(i<BlobLength)             //循环处理字符串转换,每次1024;Oracle字符串限制最大4k
       {
         bytes= BlobContent.getBytes(i,1024) ;
         i=i+1024;
         newStr = newStr+new String(bytes,"gb2312");         
       }
       */
       newStr = new String(BlobContent.getBytes(1,900),"gb2312")+"....";  //简化处理,只取前900字节
       return newStr;
     }
   }
   catch(Exception e)     //oracle异常捕获
   {
     e.printStackTrace();
   }     
   return newStr;
}
}


--然后在Oracle中把这个类导入成为一个函数,执行命令
create or replace function ConvertBLOB(blobObject BLOB)
return varchar2
as language java name
'MyOracle.BLOB.BLOBObject.ConvertBLOBtoString(oracle.sql.BLOB) return java.lang.String';

--执行相应的操作
select ConvertBLOB(BLOBField),dbms_lob.getlength(BLOBField),BLOBFieldfrom TableName

以上代码均在PL/SQL developer中开发并调试通过,很有意思
ITPUB个人空间3],e4[Y~1P'bLY8D%N.R5B65171sm)yY7Lw5t @6517Wv[z�AeU.e6517ITPUB个人空间(|*aA2^{c|b1u1f _O7K]J6517(y!j/2TsgEH6517&S8g&c~Y2PN�H6517ITPUB个人空间b6t0mk$Mj3h[(cr"e9Y j,f-a/B8}i/M.y6517Y6dKIbm7L d6517ITPUB个人空间&c^fkl S+W2L�c9Lr C$kkK)J7n6517LS-zx$jE2d6517%nH%N%yx"aR6517ITPUB个人空间v)q.BX5G,T�`ITPUB个人空间5{$@3? Hi [t[)DFF6517ITPUB个人空间!BC.])?lEgh1F/AC6517(zqx"O+A6?U U-?6517,W@ d*CWSa A6517ITPUB个人空间.OWO8u$a%~,uLL[^BL;S+N0Av!]L6517ITPUB个人空间3h1VsR8}+D/T&a5p!Z�j"}?-h,A6517ITPUB个人空间#v!P:lny a@(HK'JITPUB个人空间A2`mDG4e%Meg9f O6w0FC2M#@fJc6517 vDM$]*[I./m6517ITPUB个人空间Yx4O:G'DITPUB个人空间 @A8_X;P&R~SITPUB个人空间sY9eD*f)YH"bITPUB个人空间0/LA:W,t%m"LITPUB个人空间!{B6M:b"V-QcPXY6517Hbapde#[TbT(D6517J9h&QJP2G V6517)bP$c?A.j'b W6517ITPUB个人空间&_gB[W:LaqkJITPUB个人空间} YY'p&J*Br:Yt:RE/P6517ITPUB个人空间]3E;a^'Sh-aITPUB个人空间;Oc)H}?4i PITPUB个人空间'LSC�Y3u|MITPUB个人空间7S+zA*mQW"F3|BITPUB个人空间9uz1i]�[ vEZxm"|Zcbw$],g p8R;j6517ITPUB个人空间�Xj)j4OP!J/l4pcE6]5G!m3Sl7sF6517RA;py�[Y&{@+A];@6517m4c"b#}w0XeZ6517n$c5V}mD a6517ITPUB个人空间UjFN,~ITPUB个人空间.RDpW@ZNK%Ah)jpX/8Q*Dceh%n6517B8m3B+@-`p6517ITPUB个人空间&Ce2kl*B&ZyBg8S,|/#y}/pz ~k,z65171?H!rmk!r6517XS8}'J.Z2N)H!P]o5b6517


当然通过oracle包也可以实现这样的功能,如:

select UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(BLOBField)) from TableName;

所以还是不要发明同样的轮子

原创粉丝点击