阅读了一个帖子“有没有可能写出比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 )
突发灵感,加上原来有一个需求,需要从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转换为字节数组
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;
}
}
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
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
,如需转载请自行联系原作者