星空网 > 软件开发 > 数据库

MySQL 存储过程实例

虽然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))BEGINDECLARE 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()BEGINDECLARE 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;REPEATset 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 = 1END 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 = 1END 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. 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;  }

 




原标题:MySQL 存储过程实例

关键词:MYSQL

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

沃尔玛向旗下电商平台Flipkart注资6亿美元:https://www.kjdsnews.com/a/1696261.html
L Catterton投资!儿童护肤品牌Hi!Papa完成A+轮融资:https://www.kjdsnews.com/a/1696262.html
TikTok Shop马来西亚上线Mall商城:https://www.kjdsnews.com/a/1696263.html
OpenAI最大竞争对手Anthropic拟融资7.5亿美元:https://www.kjdsnews.com/a/1696264.html
分享 | 产品刚发货就在售?亚马逊这个功能让你错失新品期了吗?:https://www.kjdsnews.com/a/1696265.html
英国电商平台Qogita完成8000万欧元B轮融资:https://www.kjdsnews.com/a/1696266.html
深圳到西安自驾路线攻略 深圳到西安自驾最佳路线:https://www.vstour.cn/a/411228.html
松花蛋是哪里的特产松花蛋的产地:https://www.vstour.cn/a/411229.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流