有需求,要调用 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;
}
最后,还是一样的,取得的结果集是不正确的。
作为一个遗留问题,有时间再研究!