用oracle的java存储过程实现BLOB字段的字符串读取-阿里云开发者社区

开发者社区> 技术小美> 正文

用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 中基本类型和字符串之间的转换
Java 中基本类型和字符串之间的转换 在程序开发中,我们经常需要在基本数据类型和字符串之间进行转换。 其中,基本类型转换为字符串有三种方法: 1. 使用包装类的 toString() 方法 2.
596 0
使用javascript获取wx.config内部字段解决微信分享
背景 在微信分享开发的时候我们通常的流程是 微信分享 wx.config({ appId: '', timestamp...
932 0
ORACLE 加密(TDE) 对字段加密测试
                                 ORACLE TDE(Transparent Data Encryption) 参考http://space.
1005 0
格式化字符串漏洞利用 二、格式化函数
二、格式化函数 原文:Exploiting Format String Vulnerabilities 作者:scut@team-teso.net 译者:飞龙 日期:2001.9.1 版本:v1.2 格式化函数是一类特殊的 ANSI C 函数,接受可变数量的参数,其中的一个就是所谓的格式化字符串。
886 0
Django Rest Framework动态获取字段
项目名称 drf-dynamic-fields 项目描述 提供了一个mixin,用于serializer,实现动态配置返回字段的效果。在获取数据的API的时候,在URL中加入一个查询字段fields,用来过滤返回数据的字段,减少网络传输的数据。
1361 0
ORACLE SQL脚本能否修改字段名称?
在看到标题时,你先想想:在ORACLE中能否修改一个表的某个字段名呢?如果能的话,你是否还记得SQL脚本如何写的呢,呵呵,写这个的目的是因为在论坛上看见许多信誓旦旦的说ORACLE中不能修改字段名称,只能先删除、后添加字段或是其它方法来处理。
648 0
Oracle Q-quote delimiter Quote(q) 字符串原样输出
      在sql查询中,我们经常需要原样输出字符串,如果字符串中含有大量的单引号、双引号或者特殊字符,那么需要用单引号转义拼接字符串,这样会非常的麻烦。
1223 0
C实现特定字符串数据的排序与输出
一、案例完整代码 点击(此处)折叠或打开 /**************************************************************** * Name : sort_and_output.c * Author : dyli2000 * Date : 20121102 * Description :     对学生成绩由高到低输出案例。
836 0
+关注
5130
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载