开发者社区> 技术小美> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介:
+关注继续查看
阅读了一个帖子“有没有可能写出比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中开发并调试通过,很有意思
 

当然通过oracle包也可以实现这样的功能,如:
select UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(BLOBField)) from TableName;
所以还是不要发明同样的轮子

 





本文转自baoqiangwang51CTO博客,原文链接:http://blog.51cto.com/baoqiangwang/312702,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
JAVA读取EMF文件并转化为PNG,JPG,GIF格式
JAVA读取EMF文件并转化为PNG,JPG,GIF格式 使用第三方库下载地址为:http://java.freehep.org/vectorgraphics/index.html 主要思路: 使用EMFInputStream读取EMF文件,然后使用EMFRenderer对象将EMF绘制到创建 好的空白的BufferedImage里面。
1565 0
Java实现定时任务的三种方法(转)
  在应用里经常都有用到在后台跑定时任务的需求。举个例子,比如需要在服务后台跑一个定时任务来进行非实时计算,清除临时数据、文件等。在本文里,我会给大家介绍3种不同的实现方法: 普通thread实现 TimerTask实现 ScheduledExecutorService实现 普通thread 这是最常见的,创建一个thread,然后让它在while循环里一直运行着,通过sleep方法来达到定时任务的效果。
1099 0
java线程间通信[实现不同线程之间的消息传递(通信),生产者和消费者模型]
线程通信,线程之间的消息传递; 多个线程在操作同一个资源,但对共享资源的操作动作不同;它们共享同一个资源,互为条件,相互依赖,相互通信让任务向前推进。 线程的同步,可以解决并发更新同一个资源,实现线程同步;但不能用来实现线程间的消息传递。 线程通信生产者和消费者和仓库是个典型模型: 生产者:没有生产之前通知消费者等待,生产产品结束之后,马上通知消费者消费 消费者:没有消费之前通知
2396 0
JAVA实现AES加密
1. 因子        上次介绍了《JAVA实现DES加密》,中间提到近些年DES使用越来越少,原因就在于其使用56位密钥,比较容易被破解,近些年来逐渐被AES替代,AES已经变成目前对称加密中最流行算法之一;AES可以使用128、192、和256位密钥,并且用128位分组加密和解密数据。
887 0
Java实现中文算数验证码(算数运算+-*/)
为了防止,页面向数据库暴力注册入力,用户登录暴力破解,所以加入验证码,验证码无法被软件获取上边的内容(加入算数计算,更加安全),所以在现在技术,暂时安全。 先看效果图: 第一次加载比较慢,防止无法加载验证码显示,后台获取准备好的默认正在加载图片(静态图片),后台图片获取好后,替代。 验证码效果图:                后台Java图片实现类Verificatio
1614 0
java中treemap和treeset实现(红黑树)
TreeMap 的实现就是红黑树数据结构,也就说是一棵自平衡的排序二叉树,这样就可以保证当需要快速检索指定节点。 TreeSet 和 TreeMap 的关系 为了让大家了解 TreeMap 和 TreeSet 之间的关系,下面先看 TreeSet 类的部分源代码: public class TreeSet<E> extends AbstractSe
1517 0
Java开发中的Memcache原理及实现
七、            Memcached 客户端程序 Memcached的java客户端已经存在三种了: ?  官方提供的基于传统阻塞io由Greg Whalin维护的客户端 ?  Dustin Sallings实现的基于java nio的Spymemcached ?  XMemcached 1. 三种API比较 1)      memcached client for j
1086 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
ORACLE 10g 数据库体系结构图
立即下载
Oracle 至PostgreSQL案例分享
立即下载
JAVA反射原理以及一些常见的应用
立即下载