Spring调用ORACLE存储过程的结果集(二)

日期: 2008-06-17 来源:TechTarget中国

  以上是对于通用的存储过程返回的结果集的处理,而oracle,它不能返回结果集,只能在输出参数中返回一个cursor,所以通用的流程中你获取不到任何结果:


  package PK_AREA_PUBLIC is
  TYPE serarch_result IS REF CURSOR;
  PROCEDURE area_search(vTarget_in IN VARchar2 ,cur_result_out OUT serarch_result) ;
  end PK_AREA_PUBLIC;


  package body PK_AREA_PUBLIC is
  PROCEDURE area_search(vTarget_in IN VARchar2 ,cur_result_out OUT serarch_result)
  IS
  sqlstr VARchar2(1000);
  BEGIN
  sqlstr:=’select ……………………………’;
  OPEN cur_result_out FOR sqlstr USING vTarget_in;
  END area_search;
  end PK_AREA_PUBLIC;


  对于上面的例子,存储过程有一个输入参数,一个输出参数,我们要接受输出参数作为结果集处理.所以注册的时候应该注册为:


  cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);//输出参数


  这样在存储过程执行后,获取输出数造型为ResultSet就可以处理:


  ResultSet rs = (ResultSet)cs.getObject(2);


  如果有多个结果集就用多个输出参数.


  明白了ORACLE的特殊性,我们再看看在spring中如果处理它的存储过程的结果集:


  spring在处理复杂对象的时候,大都采用回调的方法,要求程序员自己实现接口方法.也就是它提供了程序运行时的参数,要求你自己对这些参数进行处理.对于JdbcTemplate,它在很多地方提供了ResultSet参数供程序员处理.在Spring文档中提供了对于通用流程,也就是从存储过程执行结果中获取结果集的例程:


  Map out = &#101xecute(new HashMap());


  其实它是默认实现了上面JDBC通用流程中对ResuleSet到Map的封装.而对于Oracle,我们就必须自己手实现对输出参数中ResultSet的回调:


  public class SpringStoredProcedure
  extends StoredProcedure {
  public ArrayList<HashMap> set = new ArrayList<HashMap>();
  //声明一个用于接收结果集的数据结构,其中的元素为row,用map存放


  private Map inParam;//输入参数
  private RowMapper rm = new RowMapper(){
  public Object mapRow(ResultSet rs,int rowNum) throws SQLException{
  return null;//不用从存储过程本身获取结果
  }
  };


  private RowMapperResultReader callback = new RowMapperResultReader(rm ){
  public void processRow(ResultSet rs) //回调处理
  throws SQLException{
  int count = rs.getMetaData().getColumncount();
  String[] header = new String[count];
  for(int i=0;i<count;i++)
  header[i] = rs.getMetaData().getColumnName(i+1);
  while(rs.next()){
  HashMap<String,String> row = new HashMap(count+7);
  for(int i=0;i<count;i++)
  row.put(header[i],rs.getString(i+1));
  set.add(row);
  }
  }
  }; //RowMapperResultReader作为输出参数的回调句柄
  public SpringStoredProcedure(DataSource ds, String SQL) {
  setDataSource(ds);
  setSql(SQL);

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐