1、存储过程
CREATE PROCEDURE `CrossDayNumDgl`(Mon VARCHAR(10),areacode VARCHAR(50),OwnerName varchar(50),MonitorName VARCHAR(50),supplyName VARCHAR(50),LimitStart int, LimitEnd int) BEGIN DECLARE sSQL VARCHAR(3000);
DECLARE sCon VARCHAR(3000);
DECLARE s VARCHAR(20);
DECLARE i,iDays INT DEFAULT 1;
....这里省略....
select a.FreezeMon as FreezeMon,a.meterid as meterid from Results a join tmp_table b on a.meterid =b.meterid;
END
2、数据库客户端执行存储过程如下:
CALL CrossDayNumDgl("2017-09",'00014','太原','小店','太原',0,20);
执行结果如下:
3、java代码通过hibernate调用存储过程
//调用存储过程
SQLQuery query = this.getCurrentSession().createSQLQuery("{CALL CrossDayNumDgl(?,?,?,?,?,?,?)}");
//传参
query.setString(0,"2017-09");
query.setString(1, "00014");
query.setString(2, "太原");
query.setString(3, "小店");
query.setString(4, "太原");
query.setInteger(5, 0);
query.setInteger(6, 20);
//查询结果集,注意每一行为Object[]数组,每一列为Object
List<Object[]> list = query.list();
if(list != null && list.size() > 0){
//遍历取每一行数据
for (Object[] obj : list) {
//取每一列
System.out.println("FreezeMon:" + obj[0].toString());
System.out.println("meterid:" + obj[1].toString());
}
}
打印结果:
FreezeMon:2017-09
meterid:0351-09768
4、hibernate取出存储过程的输出参数
//调用存储过程
ProcedureCall pc = this.getCurrentSession().createStoredProcedureCall("CrossDayNumDgl");
//设置输入参数
pc.registerParameter("Mon", String.class, ParameterMode.IN);
//设置输出参数
pc.registerParameter("cnt", Long.class, ParameterMode.OUT);
//获取输出参数的值
long cnt = (Long)pc.getOutputs().getOutputParameterValue("cnt");
5、关于可以同时获取结果集和输出参数的方法我还没有想到好的办法
还有不是我们系统不暴露connection,所以无法通过CallableStatement 去执行相关操作。