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

来源:互联网 发布:jquery数组清空 编辑:程序博客网 时间:2024/06/08 04:38

阅读了一个帖子“有没有可能写出比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的相互界限就已经不明确了。
当然关系型数据库最好做自己应该做的事情而不是大包大揽做所有的非数据库应该做的事情。


  1. --开发java类  
  2. create or replace and compile java source named BLOBObject as  
  3. package MyOracle.BLOB;             --自己定义的package  
  4. import java.io.*;                          --外部引用到的java包  
  5. import oracle.sql.*;  
  6. public class BLOBObject  
  7. {  
  8. public static String ConvertBLOBtoString(oracle.sql.BLOB BlobContent)  
  9. {  
  10.    byte[] msgContent= BlobContent.getBytes(); //BLOB转换为字节数组  
  11.   
  12.    byte[] bytes;       //BLOB临时存储字节数组  
  13.    String newStr = ""//返回字符串  
  14.    int i=1;            //循环变量  
  15.    long BlobLength;    //BLOB字段长度  
  16.    try        
  17.    {  
  18.      BlobLength=BlobContent.length();  //获取BLOB长度  
  19.      if (msgContent == null || BlobLength==0)  //如果为空,返回空值  
  20.      {  
  21.        return "";  
  22.      }  
  23.      else                              //处理BLOB为字符串  
  24.     {  
  25.        /* 
  26.        while(i<BlobLength)             //循环处理字符串转换,每次1024;Oracle字符串限制最大4k 
  27.        { 
  28.          bytes= BlobContent.getBytes(i,1024) ; 
  29.          i=i+1024; 
  30.          newStr = newStr+new String(bytes,"gb2312" ;          
  31.        } 
  32.        */  
  33.        newStr = new String(BlobContent.getBytes(1,900),"gb2312" +"....";  //简化处理,只取前900字节  
  34.        return newStr;  
  35.      }  
  36.    }  
  37.    catch(Exception e)     //oracle异常捕获  
  38.    {  
  39.      e.printStackTrace();  
  40.    }       
  41.    return newStr;  
  42. }  
  43. }  

 

  1. --然后在Oracle中把这个类导入成为一个函数,执行命令  
  2. create or replace function ConvertBLOB(blobObject BLOB)  
  3. return varchar2  
  4. as language java name  
  5. 'MyOracle.BLOB.BLOBObject.ConvertBLOBtoString(oracle.sql.BLOB) return java.lang.String';  
  6.   
  7. --执行相应的操作  
  8. select ConvertBLOB(BLOBField),dbms_lob.getlength(BLOBField),BLOBFieldfrom TableName  

以上代码均在PL/SQL developer中开发并调试通过,很有意思

0 0
原创粉丝点击