现在的位置: 首页 > 综合 > 正文

Hibernate 调用Oralce 包,无法读取游标

2013年08月21日 ⁄ 综合 ⁄ 共 2607字 ⁄ 字号 评论关闭

    有需求,要调用 Oracle 的包,并且有回调游标,结果是结果集返回来了,就是返回来时,丢了不少数据,始终没有明白什么原因:

代码如下:

 Query q = session.getNamedQuery("proc_query_by_hibernate");
  q.setString(0, "1");
  q.setString(1, "1,2,212,201,203,202,5,6,8,9");
  q.setString(2, "100931000000000000");
  q.setString(3, "20090505");
  q.setString(4, "1");
  q.setFloat(5, 1);
  q.setFloat(6, 1);

  List ls = q.list();
  System.out.println("共有:" + ls.size());
  for (Object obj:ls)
  {
      Object[] mo=(Object[])obj;
      System.out.println("count:"+mo.length);
      for (int i=0;i<mo.length;i++)
  {
      if (mo[i]!=null)
   System.out.println(mo[i].toString());
      else
   System.out.println(i+"空");
  }
  }
  session.close();

 

hbm 中的配置如下:

<sql-query name="proc_query_by_hibernate" callable="true">
  {?=call pkg_stat_query.proc_query_by_hibernate(?,?,?,?,?,?,?) }
 </sql-query>

 

没有指定返回的类,是因为返回的结果集是变化。

 

读出来后的结果和实际的结果差别很大。

 

改成 jdbc 后,如下:

OracleCallableStatement ocst = null;
 Connection con = session.connection();
 try
 {
     String procedure = "{call  pkg_stat_query.proc_query_by_date_point(?,?,?,?,?,?,?,?,?,?) }";
     ocst = (OracleCallableStatement) con.prepareCall(procedure);
     ocst.setString(1, "1");
     ocst.setString(2, "1,2,212,201,203,202,5,6,8,9");
     ocst.setString(3, "100931000000000000");
     ocst.setString(4, "20090505");
     ocst.setString(5, "1");
     ocst.setFloat(6, 1);
     ocst.setFloat(7, 1);
     ocst.setInt(8, 0);
     ocst.setString(9, "");
     ocst.registerOutParameter(10, OracleTypes.CURSOR);
 }
 catch (SQLException ex)
 {
     // String str = "得到OracleCallableStatement失败:" + ex.getMessage();
     // log.error(str);
     // throw new CDaoException(str, ex);
     ex.printStackTrace();
 }
 try
 {
     ocst.execute();
     ResultSet rs = (ResultSet) ocst.getObject(10);
    
     List list = ResultSetToList(rs);
     for (int j=0;j<list.size();j++){
  Object obj = list.get(j);
  Object[] mo=(Object[])obj;
  for (int i=0;i<mo.length;i++)
  {
      if (mo[i]!=null)
   System.out.println(mo[i].toString());
  }
     }
    
//     while (rs.next())
//     {
//  for (int i = 1; i < 9; i++)
//  {
//      System.out.println(rs.getString(i));
//  }
//     }
 }
 catch (Exception e)
 {
     // TODO Auto-generated catch block
     e.printStackTrace();
 }

 

其中,ResultSetToList 定义如下:

 public static List<HashMap<String, Object>> ResultSetToList(ResultSet rs) throws Exception
    {
 List<HashMap<String, Object>> list = new LinkedList<HashMap<String, Object>>();
 try
 {
     ResultSetMetaData rsmd = rs.getMetaData();
     int numberOfColumns = rsmd.getColumnCount();
     while (rs.next())
     {
  HashMap<String, Object> hm = new HashMap<String, Object>();
  for (int i = 1; i <= numberOfColumns; i++)
  {
      hm.put(rsmd.getColumnName(i), rs.getObject(i));
  }
  list.add(hm);
     }
 }
 catch (SQLException ex)
 {
     throw new Exception(ex);
 }
 return list;
    }

 

 

最后,还是一样的,取得的结果集是不正确的。

 

作为一个遗留问题,有时间再研究!

【上篇】
【下篇】

抱歉!评论已关闭.