用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 ,如需转载请自行联系原作者
相关文章
|
29天前
|
存储 SQL Oracle
Oracle系列十五:存储过程
Oracle系列十五:存储过程
|
29天前
|
SQL 存储 Oracle
一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法(上)
一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法
|
9天前
|
存储 SQL Oracle
oracle 存储过程导出sql语句 导出为文件
oracle 存储过程导出sql语句 导出为文件
|
21天前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之如何将Oracle中的BLOB数据类型转换为byte数组
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
29天前
|
Oracle 关系型数据库 Java
java操作多数据源将oracle数据同步达梦数据库
java操作多数据源将oracle数据同步达梦数据库
|
29天前
|
SQL 存储 Oracle
一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法(下)
一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法
|
29天前
|
存储 SQL Oracle
Oracle存储过程与自定义函数的调用:异同与实战场景
【4月更文挑战第19天】Oracle的存储过程与自定义函数各有特色,存储过程用于封装复杂SQL操作,常在批量处理和数据维护中使用,通过CALL或EXECUTE调用;而自定义函数则用于简单计算和查询,返回单一值,可直接在SQL语句中调用。了解两者异同,如返回值方式、调用方式和应用场景,能提升数据库管理效率。实战场景包括:使用存储过程定期清理过期数据,用自定义函数在查询中动态计算字段值。
|
29天前
|
存储 SQL Oracle
Oracle存储过程:数据王国的魔法师
【4月更文挑战第19天】Oracle存储过程是封装复杂SQL操作的魔法工具,存储在数据库中以便重复调用。它们提供高效执行和安全,类似于预编译的程序。创建存储过程涉及定义名称和参数,如示例所示,创建一个根据员工ID获取姓名和薪资的`get_employee_info`过程。调用存储过程可提高代码可读性和性能,使数据库管理更为便捷。
|
21天前
|
Oracle 关系型数据库 Java
实时计算 Flink版操作报错之读取Oracle数据库时遇到找不到驱动,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
实时计算 Flink版操作报错之读取Oracle数据库时遇到找不到驱动,是什么原因
|
Oracle 关系型数据库
Oracle字符串函数
Oracle字符串函数   平常我们用Oracle主要有两种字符串类型1.char始终为固定的长度,如果设置了长度小于char列的值,则Oracle会自动用空格填充的。当比较char时,Oracle用空格将其填充为等长,再进行比较。
750 0

推荐镜像

更多