原文地址 http://www.zhihaoyu.com/article/62
有很长一段时间没写procedure了,MySql的存储过程的写法跟sql server稍有不同,这里用一个“点赞”的例子做下简单记录。
首先定义proc:
1.默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令。这里delimiter先将结束符号改为//还是很有必要的。
2.参数的定义分为IN|OUT|INOUT|几种,用法有点类似于编译语言中实参和形参的传递。基本上in用于传入参数,out用来作返回值。
3.调用 用call语句而不是exec
4.语法上还有狠多细微差别,不过这些都不是事儿。
5.一开始我传入参数名和column名是一样的,这样的where条件判断始终为true是不正确的:
(条件判断始终为true)
JDBC中调用使用的是CallableStatement也非常简单:
/**
* 执行存储过程的函数,返回非table值
* @param sql
* @param params
* @return
*/
public static List<Object> executeProc(String sql,List<MyColumn> params){
List<Object> list = new ArrayList<Object>();
Connection con = null;
CallableStatement cs = null;
ResultSet rs = null;
MyColumn temp = null;
try {
con = getConnection();
//初始化CallableStatement
cs = con.prepareCall(sql);
for(int i=0;i<params.size();i++){
temp = params.get(i);
//判断参数类型 in、out处理方式不同
if(temp.procParamType==MyColumn.PROC_PARAM_OUT){
switch(temp.type){
case MyColumn.T_INTEGER:
cs.registerOutParameter(temp.index, Types.INTEGER);
break;
case MyColumn.T_STR:
cs.registerOutParameter(temp.index, Types.VARCHAR);
break;
}
}
else if(temp.procParamType==MyColumn.PROC_PARAM_IN){
switch(temp.type){
case MyColumn.T_INTEGER:
cs.setInt(temp.index, (int) temp.value);
break;
case MyColumn.T_LONG:
cs.setLong(temp.index, (long) temp.value);
break;
case MyColumn.T_STR:
cs.setString(temp.index, (String) temp.value);
break;
}
}
}
//执行语句
cs.execute();
//获取返回值:类型为out的参数
for(int i=0;i<params.size();i++){
temp = params.get(i);
if(temp.procParamType==MyColumn.PROC_PARAM_OUT){
switch(temp.type){
case MyColumn.T_INTEGER:
list.add(cs.getInt(temp.index));
break;
case MyColumn.T_STR:
list.add(cs.getString(temp.index));
}
}
}
}catch (Exception e) {
e.printStackTrace();
} finally {
close(con, cs, rs);
}
return list;
}
调用该函数:
public int zan(int blogId, int userId) {
String sql = "call proc_zan(?,?,?)";
List<MyColumn> params = new ArrayList<MyColumn>();
params.add(new MyColumn(1, MyColumn.T_INTEGER, userId));
params.add(new MyColumn(2, MyColumn.T_INTEGER, blogId));
params.add(new MyColumn(3, MyColumn.T_INTEGER, null, MyColumn.PROC_PARAM_OUT));
List<Object> result = SqlHelper.executeProc(sql, params);
return (int) result.get(0);
}