Mysql存储过程

原文地址 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);
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值