自定义函数从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;
//===================================================================
}
}