}
}
ResultSet rs=cs.executeQuery();//执行并返回结果集 while(rs.next()){//循环读取逐行
System.out.print(rs.getString(2)+\); }
DBHelper.closeAll(co, cs, rs);
执行之后,控制台会输出Tom
需要注意的是:获取CallableStatement对象方法不变,需要更改的是co.prepareCall(String arg0)方法中的参数,更改为“{call 存储过程名 (?)}“ 。其中存储过程参数放在存储过程名字之后的()之中,?指代参数,有几个参数就需要在()中添加几个 ?. (这里字符串类型不需要加单引号), 相当于占位符..然后需要使用cs.setObject(Object o), 根据参数类型调用相应的set方法. ..接下来一样,这里不多做解释…
3. 无参有返:
创建无参有返的存储过程如下: createprocproc_updateAge as begin
updatestudentInfosetstuAge=21 wherestuAge=20 return 100 end
执行上面的存储过程示例代码:
publicstaticvoid main(String[] args) throws Exception { Connection co=DBHelper.getCon();//获取链接对象
CallableStatement cs=co.prepareCall(\proc_updateAge}\);//通过连接获取CallableStatement对象
cs.registerOutParameter(1, java.sql.Types.INTEGER);//注册参数为传出或者返回类型参数Int类型 cs.execute();//执行
int result=cs.getInt(1);//获取参数 DBHelper.closeAll(co, cs, null); System.out.println(result);//输出 }
需要注意的是:获取CallableStatement对象方法不变,需要更改的是co.prepareCall(String arg0)方法中的参数,更改为“{?=call 存储过程名}“ . 然后使用cs.registerOutParameter(int paramIndex,sqlType); 方法注册参数,第一个参数为需要注册参数的下标(从1开始), 第二个为注册的类型, 不是java中的数据类型,而是sql的数据类型, 可以使用java.sql.Types.类型 方法类生命sql中的类型… 获取返回值,在调用cs对象的执行方法之后, 使用get方法 即可接受到返回值.
控制台输出100
4. 有参有返:
上面已经讲了有参无返,无参有返的调用方法, 那么举一反三很简单就可以想到有参有返如何执行了, 我还是写一下吧.
存储过程
createprocproc_deleteStuByName @namevarchar(20) as
begin
deletefromstudentInfowherestuName=@name return 100 end
java执行此存储过程:
//测试类
publicclass Test {
publicstaticvoid main(String[] args) throws Exception { Connection co=DBHelper.getCon();//获取链接对象 CallableStatement cs=co.prepareCall(\
proc_deleteStuByName (?)}\);//通过连接获取CallableStatement对象 cs.registerOutParameter(1, java.sql.Types.INTEGER);//注册参数为传出或者返回类型参数Int类型 cs.setString(2, \); cs.execute();//执行
int result=cs.getInt(1);//获取参数 DBHelper.closeAll(co, cs, null); System.out.println(result);//输出 } }
关于实现过程,就不在解释,需要注意的是:只有传出参数或者return才需要registerOutParameter()注册参数, 其余的为普通参数, 直接使用set方法就可为参数赋值, 参数下标索引, 从1开始, 从左往右一次增长…
5. 带有传出参数的存储过程:
看到这里, 相信你已经基本上可以猜到如何使用带有传出参数的存储过程了, 对的, 就是使用registerOutParameter()方法
存储过程代码:
createprocproc_deleteStuByNameAndGetParam @namevarchar(20),
@stuNamevarchar(20) out put as begin
deletefromstudentInfowherestuName=@name
select@stuName=stuNamefromstudentInfowherestuId=1 end
java执行此存储过程:
//测试类
publicclass Test {
publicstaticvoid main(String[] args) throws Exception { Connection co=DBHelper.getCon();//获取链接对象 CallableStatement cs=co.prepareCall(\proc_deleteStuByNameAndGetParam (?,?)}\);//通过连接获取CallableStatement对象
cs.setString(1, \);
cs.registerOutParameter(2, java.sql.Types.VARCHAR);//注册参数为传出或者返回类型参数Int类型 cs.execute();//执行
String result=cs.getString(2);//获取参数 DBHelper.closeAll(co, cs, null); System.out.println(result);//输出 } }
关于实现过程,需要解释吗?
总结:
1. 执行存储过程是使用CallableStatement接口的对象
2. 使用Connection对象的prepareCall(“{call 存储过程名 (参数) }”)方法方法指定存储过程,并返回CallableStatement的一个对象.
3. 参数下标从1开始, 由左往右增长,可是使用?方式声明参数, 使用set方法给参数赋值
4. 如果存储过程中有return或者传出参数时候, 需要明确使用CallableStatement对象的registerOutParameter(参数下标,sql类型)注册参数. ”
最后.
祝大家学习愉快. 工作生活顺利!