首页 数据库 mysql教程 MySQL 存储过程实例_MySQL

MySQL 存储过程实例_MySQL

May 30, 2016 pm 05:11 PM
实例 过程

虽然MySQL的存储过程,一般情况下,是不会使用到的,但是在一些特殊场景中,还是有需求的。最近遇到一个sql server向mysql迁移的项目,有一些sql server的存储过程需要向mysql迁移。所以进行复习了一下。下面是一些存储过程的例子。

 

1. 例子1


DELIMITER //
DROP PROCEDURE IF EXISTS loginandreg //

CREATE PROCEDURE loginandreg(
OUT userId     BIGINT,
IN user_Pwd                          VARCHAR(32),
IN user_MobileCode                   VARCHAR(16),
IN user_RegIP                        VARCHAR(16)
)
BEGIN

DECLARE cnt  BIGINT DEFAULT 0;
DECLARE cnt2  BIGINT DEFAULT 0;
DECLARE outid BIGINT DEFAULT -1;

SELECT COUNT(*) INTO cnt FROM Users u WHERE u.user_MobileCode=user_MobileCode;

IF cnt > 0 THEN
    SELECT COUNT(*) INTO cnt2 FROM Users u WHERE u.user_MobileCode=user_MobileCode AND u.user_Pwd=user_Pwd;
    
    IF cnt2 > 0 THEN
        SELECT u.userId INTO outid FROM Users u 
        WHERE u.user_MobileCode=user_MobileCode AND u.user_Pwd=user_Pwd LIMIT 1;
    ELSE    
        SELECT -1 INTO outid;
    END IF;
    
    SELECT outid INTO userId;
ELSE 
    INSERT INTO Users(user_Pwd,user_MobileCode,user_Visibility,user_Level,user_RegTime,
                user_RegIP,user_Collecter,user_Collected)
    VALUES (user_Pwd,user_MobileCode,6,6,NOW(),user_RegIP,0,0);

    SET userId=LAST_INSERT_ID();
    SELECT userId;
END IF;

END //
DELIMITER ;
登录后复制

知识点:

1)参数分为 in, out 类型,即输入类型和输出类型;

2)select xx into varible from table where ... 句式:

SELECT COUNT(*) INTO cnt FROM Users u WHERE u.user_MobileCode=user_MobileCode;

3)if cnt > 0 then ... elseif cnt =0 then ... else ... end if;

if 语句注意带有 then 关键字和 end if 结束关键字。

4)获取 insert 语句的主键:set userId=last_insert_id(); select userId;

select last_insert_id() into userId; 也是可以的。

5)如何调用该存储过程:

CALL loginandreg(@userId,'112358','18357xxx7','127.0.0.1');

SELECT @userId;

最后的 select @userId 就是存储过程的 out 类型参数返回的结果。

2. 例子2

DELIMITER //
DROP PROCEDURE IF EXISTS mingRenTangJiangLi //
CREATE PROCEDURE mingRenTangJiangLi()
BEGIN
DECLARE total_level,role_id,ming_ren_level,ming_ren_type,
                fuben_times,tiaozhan_times,duobei_shijian,no_more_data INT DEFAULT 0;

DECLARE my_cursor CURSOR FOR SELECT playerRoleId,`level`,type from mingrentang;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_data = 1;

OPEN my_cursor;
FETCH my_cursor INTO role_id,ming_ren_level,ming_ren_type;

REPEAT
set total_level = ming_ren_level + 10 * (ming_ren_type-1);
set fuben_times = total_level / 2;
set tiaozhan_times = total_level /3;
set duobei_shijian = 10 * total_level;
select total_level,fuben_times,tiaozhan_times,duobei_shijian;

update player_role set hufu=hufu+1000,paihangbangNumber=paihangbangNumber+tiaozhan_times,
                duobeiShiJian=duobeiShiJian+duobei_shijian,fubenTimes=fubenTimes+fuben_times;

FETCH my_cursor INTO role_id,ming_ren_level,ming_ren_type;
UNTIL no_more_data = 1
END REPEAT;

CLOSE  my_cursor;

END //
DELIMITER ;
登录后复制

知识点:

1)该例子演示了游标的用法:

DECLARE my_cursor CURSOR FOR SELECT playerRoleId,`level`,type from mingrentang;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_data = 1;

定义了游标语句,也说明了游标循环结束时设置的标志:SET no_more_data = 1;

OPEN my_cursor;

FETCH my_cursor INTO role_id,ming_ren_level,ming_ren_type;

打开游标,从游标中获取值。

REPEAT

......

FETCH my_cursor INTO role_id,ming_ren_level,ming_ren_type;

UNTIL no_more_data = 1

END REPEAT;

repeat 循环 直到 no_more_data = 1: UNTIL no_more_data = 1,然后结束循环 END REPEAT;

最后关闭游标 close my_cursor;

因为上面在定义游标时,指明了,没有数据时设置了 no_more_data = 1,所以这里使用 UNTIL no_more_data = 1 来退出repeat

2)判断相等是使用 = ,而不是 == ,赋值操作是使用 set var=xxx; :set fuben_times = total_level / 2;

3. Java 如何调用存储过程

1)hibernate调用存储过程:

    /*
         * 调用无参数的存储过程,传入存储过程名字
         */
    public int callProcedure(final String procedureName)
    {
            int count = (Integer)this.getHibernateTemplate().execute(
                new HibernateCallback(){
                public Object doInHibernate(Session session) throws HibernateException, SQLException {
                    String procedureSql = "{call "+ procedureName +"()}";
                    Query query = session.createSQLQuery(procedureSql);
                    Integer num = query.executeUpdate();
                    return num;
                }
            });
            return count;
    }
登录后复制

2)ibatis 调用mysql 存储过程:

    @Override
    public Long loginAndRegByProcedure(String user_Pwd, String user_MobileCode, String user_RegIP){
        Long userId = null;
        HashMap<String,Object> paramMap = new HashMap<String,Object>();  
        paramMap.put("userId", userId);  
        paramMap.put("user_Pwd", user_Pwd);  
        paramMap.put("user_MobileCode", user_MobileCode);  
        paramMap.put("user_RegIP", user_RegIP);  
        
        this.getSqlMapClientTemplate().queryForObject("Users.loginAndRegByProcedure", paramMap);  
        return (Long)paramMap.get("userId"); 
    }
登录后复制

对应的xml 文件配置:

  <parameterMap id="pro_pram_Map" class="java.util.Map">
      <parameter property="userId" javaType="java.lang.Long" jdbcType="BIGINT" mode="OUT"/>
      <parameter property="user_Pwd" javaType="java.lang.String" jdbcType="VARCHAR" mode="IN"/>
      <parameter property="user_MobileCode" javaType="java.lang.String" jdbcType="VARCHAR" mode="IN"/>
      <parameter property="user_RegIP" javaType="java.lang.String" jdbcType="VARCHAR" mode="IN"/>
  </parameterMap>
  <procedure id="loginAndRegByProcedure" parameterMap="pro_pram_Map">
      {call loginandreg(?, ?, ?, ?)}
  </procedure>
登录后复制

存储过程的参数的类型,是在xml文件中说明的。

3) JDBC 调用mysql 存储过程:

    public Long loginAndRegByProcedure2(String user_Pwd, String user_MobileCode, String user_RegIP){
        Connection conn = DbUtil.getConnection();
        CallableStatement cstmt =  conn.prepareCall("{call loginandreg(?, ?, ?, ?)}");
        cstmt.setString(2, user_Pwd);
        cstmt.setString(3, user_MobileCode);
        cstmt.setString(4, user_RegIP);
        cstmt.registerOutParameter(1, java.sql.Types.BIGINT);
        cstmt.execute();
        return cstmt.getLong(1);
    }
登录后复制

 

输入参数:cstmt.setString(2, user_Pwd);

 

输出参数:cstmt.registerOutParameter(1, java.sql.Types.BIGINT);

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Python中的SVM实例 Python中的SVM实例 Jun 11, 2023 pm 08:42 PM

Python中的支持向量机(SupportVectorMachine,SVM)是一个强大的有监督学习算法,可以用来解决分类和回归问题。SVM在处理高维度数据和非线性问题的时候表现出色,被广泛地应用于数据挖掘、图像分类、文本分类、生物信息学等领域。在本文中,我们将介绍在Python中使用SVM进行分类的实例。我们将使用scikit-learn库中的SVM模

VUE3入门实例:制作一个简单的视频播放器 VUE3入门实例:制作一个简单的视频播放器 Jun 15, 2023 pm 09:42 PM

随着新一代前端框架的不断涌现,VUE3作为一个快速、灵活、易上手的前端框架备受热爱。接下来,我们就来一起学习VUE3的基础知识,制作一个简单的视频播放器。一、安装VUE3首先,我们需要在本地安装VUE3。打开命令行工具,执行以下命令:npminstallvue@next接着,新建一个HTML文件,引入VUE3:&lt;!doctypehtml&gt;

学习Golang指针转换的最佳实践示例 学习Golang指针转换的最佳实践示例 Feb 24, 2024 pm 03:51 PM

Golang是一门功能强大且高效的编程语言,可以用于开发各种应用程序和服务。在Golang中,指针是一种非常重要的概念,它可以帮助我们更灵活和高效地操作数据。指针转换是指在不同类型之间进行指针操作的过程,本文将通过具体的实例来学习Golang中指针转换的最佳实践。1.基本概念在Golang中,每个变量都有一个地址,地址就是变量在内存中的位置。

Python中的VAE算法实例 Python中的VAE算法实例 Jun 11, 2023 pm 07:58 PM

VAE是一种生成模型,全称是VariationalAutoencoder,中文译作变分自编码器。它是一种无监督的学习算法,可以用来生成新的数据,比如图像、音频、文本等。与普通的自编码器相比,VAE更加灵活和强大,能够生成更加复杂和真实的数据。Python是目前使用最广泛的编程语言之一,也是深度学习的主要工具之一。在Python中,有许多优秀的机器学习和深度

Oracle实例数量与数据库性能关系 Oracle实例数量与数据库性能关系 Mar 08, 2024 am 09:27 AM

Oracle实例数量与数据库性能关系Oracle数据库是业界知名的关系型数据库管理系统之一,广泛应用于企业级的数据存储和管理中。在Oracle数据库中,实例是一个非常重要的概念。实例是指Oracle数据库在内存中的运行环境,每个实例都有独立的内存结构和后台进程,用于处理用户的请求和管理数据库的操作。实例数量对于Oracle数据库的性能和稳定性有着重要的影响。

PHP 简单网络爬虫开发实例 PHP 简单网络爬虫开发实例 Jun 13, 2023 pm 06:54 PM

随着互联网的迅速发展,数据已成为了当今信息时代最为重要的资源之一。而网络爬虫作为一种自动化获取和处理网络数据的技术,正越来越受到人们的关注和应用。本文将介绍如何使用PHP开发一个简单的网络爬虫,并实现自动化获取网络数据的功能。一、网络爬虫概述网络爬虫是一种自动化获取和处理网络资源的技术,其主要工作过程是模拟浏览器行为,自动访问指定的URL地址并提取所

Gin框架中的验证码使用实例 Gin框架中的验证码使用实例 Jun 23, 2023 am 08:10 AM

随着互联网的普及,验证码已经成为了登录、注册、找回密码等操作的必要流程。在Gin框架中,实现验证码功能也变得异常简单。本文将介绍如何在Gin框架中使用第三方库实现验证码功能,并提供示例代码供读者参考。一、安装依赖库在使用验证码之前,我们需要安装一个第三方库goCaptcha。安装goCaptcha可以使用goget命令:$goget-ugithub

重返未来19996-24怎么过 重返未来19996-24怎么过 Mar 02, 2024 pm 12:58 PM

重返未来1999中玩家会在其中面对很多的关卡挑战,而且其中一个个不同的关卡所带来的挑战都完全不一样,而6-24作为其中一个关卡,也肯定会有着不少玩家想知道这一关卡该如何去进行挑战吧,所以下面也是会带来相关的通关方法了。重返未来19996-24通关方法1、一句话挂30层燃烧后,等boss眩晕一顿胖揍。2、一回合优先用主C和142d挂燃烧。3、二回合用辅助和奶妈小技能挂燃烧+和主c卡攒个大招。4、三回合boss就眩晕了,然后直接用大招和伤害技能胖揍。

See all articles