自定义函数从oracle的blob字段中取数

由于特殊业务需求,要求通过自定义函数将Oralce数据库中的blob字段的数据拿到单元格中或传入其他地方使用,作为blob字段,java中要用rs.getBlob()形式,但是如果直接将该结果返回到报表单元格中,会是一个blob对象,并不是真正里边存储的数据值,所以要经过特殊转换。

如下代码所示:

import java.io.IOException;

import java.io.InputStream;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.*;

import com.runqian.base4.util.*;

import com.runqian.report4.model.expression.*;

import com.runqian.report4.usermodel.*;

public class getparam extends Function {

public Object calculate(Context arg0, boolean arg1) {

//报表中调用该函数传递过来的参数列表

if ( this.paramList.size() == 0 ) {

throw new ReportError( “getparam参数个数不恩能够为空 );

}

//取得计算表达式(得到传递给报表的参数)

Expression param1 = ( Expression )this.paramList.get( 0 );

if ( param1 == null ) {

throw new ReportError( 函数出现无效参数 );

}

//运算表达式,并取得运算结果(Object)

Object result1 = Variant2.getValue( param1.calculate(arg0,arg1),false,false );

if( result1==null ) return ObjectCache.getInteger( 0 );

String param=“”;

Statement pstmt = null;

ResultSet rs = null;

oracle.sql.BLOB blob=null;

String id=result1.toString();

Connection con = null;

try {

con = arg0.getConnectionFactory(arg0.getDefDataSourceName()).getConnection();

} catch (Exception e1) {

// TODO 自动生成 catch

e1.printStackTrace();

}

String query2=“select param from BD_RUNQIAN_DT where id=’”+id+“‘”;

try {

pstmt = con.prepareStatement(query2);

rs = pstmt.executeQuery(query2);

while(rs.next()){

blob = (oracle.sql.BLOB)rs.getBlob(“param”);

InputStream inStream = blob.getBinaryStream();

byte[] data=null;

data = new byte[(int)blob.length()];

inStream.read(data);

inStream.close();

param=new String(data);

}

rs.close();

} catch (SQLException e) {

// TODO 自动生成 catch

e.printStackTrace();

} catch (IOException e) {

// TODO 自动生成 catch

e.printStackTrace();

}

return param;

//===================================================================

}

}

热门文章