您的位置:首页 > 数据库 > Oracle

用java和oracle实现BLOB字段的字符串读取【转】

2017-04-11 18:20 676 查看
阅读了一个帖子“有没有可能写出比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中开发并调试通过,很有意思
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: