虽然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);

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

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

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

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

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

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

生成对抗网络(GAN,GenerativeAdversarialNetworks)是一种深度学习算法,它通过两个神经网络互相竞争的方式来生成新的数据。GAN被广泛用于图像、音频、文字等领域的生成任务。在本文中,我们将使用Python编写一个GAN算法实例,用于生成手写数字图像。数据集准备我们将使用MNIST数据集作为我们的训练数据集。MNIST数据集包含

快速上手Django框架:详细教程和实例引言:Django是一款高效灵活的PythonWeb开发框架,由MTV(Model-Template-View)架构驱动。它拥有简单明了的语法和强大的功能,能够帮助开发者快速构建可靠且易于维护的Web应用程序。本文将详细介绍Django的使用方法,并提供具体实例和代码示例,帮助读者快速上手Django框架。一、安装D


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

Dreamweaver CS6
视觉化网页开发工具

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

WebStorm Mac版
好用的JavaScript开发工具

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。