用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 ,如需转载请自行联系原作者
相关文章
|
1月前
|
存储 Oracle 关系型数据库
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
在YMP校验过程中,从yashandb同步至Oracle的数据出现timestamp(0)字段不一致问题。原因是yashandb的timestamp(x)存储为固定6位小数,而Oracle的timestamp(0)无小数位,同步时会截断yashandb的6位小数,导致数据差异。受影响版本:yashandb 23.2.7.101、YMP 23.3.1.3、YDS联调版本。此问题会导致YMP校验数据内容不一致。
|
1月前
|
存储 缓存 安全
Java 字符串详解
本文介绍了 Java 中的三种字符串类型:String、StringBuffer 和 StringBuilder,详细讲解了它们的区别与使用场景。String 是不可变的字符串常量,线程安全但操作效率较低;StringBuffer 是可变的字符串缓冲区,线程安全但性能稍逊;StringBuilder 同样是可变的字符串缓冲区,但非线程安全,性能更高。文章还列举了三者的常用方法,并总结了它们在不同环境下的适用情况及执行速度对比。
75 17
|
1月前
|
存储 Oracle 关系型数据库
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
|
1月前
|
存储 缓存 安全
Java字符串缓冲区
字符串缓冲区是用于处理可变字符串的容器,Java中提供了`StringBuffer`和`StringBuilder`两种实现。由于`String`类不可变,当需要频繁修改字符串时,使用缓冲区更高效。`StringBuffer`是一个线程安全的容器,支持动态扩展、任意类型数据转为字符串存储,并提供多种操作方法(如`append`、`insert`、`delete`等)。通过这些方法,可以方便地对字符串进行添加、插入、删除等操作,最终将结果转换为字符串。示例代码展示了如何创建缓冲区对象并调用相关方法完成字符串操作。
55 13
|
1月前
|
存储 Oracle 关系型数据库
【YashanDB知识库】YMP校验从yashandb同步到oracle的数据时,字段timestamp(0)出现不一致
【YashanDB知识库】YMP校验从yashandb同步到oracle的数据时,字段timestamp(0)出现不一致
|
5月前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
201 83
|
5月前
|
存储 安全 Java
Java零基础-字符串详解
【10月更文挑战第18天】Java零基础教学篇,手把手实践教学!
137 60
|
5月前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
112 26
|
5月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
182 8
|
5月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
110 6

推荐镜像

更多
下一篇
oss创建bucket