文档章节

mysql存储过程编写

z_jordon
 z_jordon
发布于 2015/04/14 11:50
字数 718
阅读 1199
收藏 60

记录一下自己写的一个mysql存储过程,在游标方面和oracle有些不一样,mysql是使用一个HANDLER来处理数据读取完的情况,如下:

DECLARE  CONTINUE HANDLER FOR NOT FOUND  SET  no_more_mobilearea = 1;

当没有数据时,把no_more_mobilearea这个变量设置为1,如下:

FETCH  cur_dm_mobile INTO temp_id, temp_mobile, temp_province_name, temp_city_name;
UNTIL  no_more_mobilearea = 1

mysql中,如果一个整数和另一个整数相除,得到的如果是一个有小数点的数字,即使把它赋给一个整数值,得到的还是一个小数,如下:

DECLARE  temp_mobile_pre INT DEFAULT 0;
set temp_mobile_pre = 1395007/10000;

此时得到的值为会139.5007,即使把它赋给一个整数变量也没有,如果想得到一个整数值,可以用FLOOR(向下取整)或ceil(向上取整)或round(四舍五入),如:

set temp_mobile_pre = FLOOR(temp_mobile/10000);

得到就是139了

mysql中的查找某个字符在字符串的函数:LOCATE(substr, str),注意是要查找的字符串在前面,后面是被查找的字符串,我开始弄错了。

mysql中的截取字符串的函数:substring(str, pos),left等,注意substring好象不支持从某个位置开始截取指定的长度,虽然给出的api说是可以,但我实际试了不行,可能跟我的数据库版本有关系,只能用left函数

mysql中连接两个字符串:concat

完整的一个存储过程如下:

CREATE DEFINER = 'root'@'localhost'
PROCEDURE ddo.test2()
BEGIN
	#Routine body goes here...
DECLARE  no_more_mobilearea, temp_idx, temp_nums, temp_type, temp_mobile_pre, temp_count INT DEFAULT 0;
DECLARE  temp_id VARCHAR(32);
DECLARE  temp_province_name, temp_city_name VARCHAR(50);
DECLARE  temp_province_code, temp_city_code VARCHAR(10);
DECLARE temp_mobile NUMERIC(7);
DECLARE  cur_dm_mobile CURSOR FOR SELECT id, mobilenumber, province_name, city_name FROM dm_mobile;
#DECLARE  cur_dm_mobile CURSOR FOR SELECT id, mobilenumber, province_name, city_name FROM dm_mobile WHERE province_code IS null;
#DECLARE  cur_dm_mobile CURSOR FOR SELECT id, mobilenumber, province_name, city_name FROM dm_mobile WHERE id = '285001';
DECLARE  CONTINUE HANDLER FOR NOT FOUND  SET  no_more_mobilearea = 1;
OPEN  cur_dm_mobile;
FETCH  cur_dm_mobile INTO temp_id, temp_mobile, temp_province_name, temp_city_name;
REPEAT
 set temp_mobile_pre = FLOOR(temp_mobile/10000);
 if (temp_mobile_pre = 133 || temp_mobile_pre = 153 || temp_mobile_pre = 180 || temp_mobile_pre = 189 || temp_mobile_pre = 181 || temp_mobile_pre = 170
     || temp_mobile_pre = 177) THEN
    set temp_type = 1;
 ELSEIF (temp_mobile_pre = 134 || temp_mobile_pre = 135 || temp_mobile_pre = 136 || temp_mobile_pre = 137 || temp_mobile_pre = 138 || temp_mobile_pre = 139
     || temp_mobile_pre = 150 || temp_mobile_pre = 151 || temp_mobile_pre = 152 || temp_mobile_pre = 157 || temp_mobile_pre = 158 || temp_mobile_pre = 159 
     || temp_mobile_pre = 182 || temp_mobile_pre = 183 || temp_mobile_pre = 184 || temp_mobile_pre = 187 || temp_mobile_pre = 188) THEN
    set temp_type = 2;
 ELSEIF (temp_mobile_pre = 130 || temp_mobile_pre = 131 || temp_mobile_pre = 132 || temp_mobile_pre = 155 || temp_mobile_pre = 156 || temp_mobile_pre = 185
     || temp_mobile_pre = 186 || temp_mobile_pre = 176) THEN
    set temp_type = 3;
 ELSEIF (temp_mobile_pre = 145 || temp_mobile_pre = 147) THEN
    set temp_type = 4;
 ELSE
    SET temp_type = 5;
end if;
 select count(*) into temp_count from t_s_territory where territoryname like concat(temp_province_name, '%');
 if (temp_count = 1) THEN
     select territorycode into temp_province_code from t_s_territory where territoryname like concat(temp_province_name, '%');
 ELSEIF (temp_count > 1) THEN
     select territorycode into temp_province_code from t_s_territory where territoryname like concat(temp_province_name, '%') limit 1;
 ELSE
     set temp_province_code = 'null';
 end if;
 select count(*) into temp_count from t_s_territory where territoryname like concat(temp_city_name, '%');
 if (temp_count = 1) THEN
     select territorycode into temp_city_code from t_s_territory where territoryname like concat(temp_city_name, '%');
 ELSEIF (temp_count > 1) THEN
     select territorycode into temp_city_code from t_s_territory where territoryname like concat(temp_city_name, '%') limit 1;
 ELSE
     set temp_city_code = 'null';
 end if;
if (temp_province_code <> 'null') THEN
  IF (temp_city_code = 'null') THEN
    set temp_city_code = temp_province_code;
  END IF;
  update dm_mobile set province_code = temp_province_code, city_code = temp_city_code, type = temp_type where id = temp_id;
end if;
 if (temp_nums = 1000) then
     set temp_nums = 0;
     commit;
 end if;
FETCH  cur_dm_mobile INTO temp_id, temp_mobile, temp_province_name, temp_city_name;
UNTIL  no_more_mobilearea = 1
end REPEAT;
CLOSE  cur_dm_mobile;
commit;
END


© 著作权归作者所有

共有 人打赏支持
z_jordon
粉丝 36
博文 251
码字总数 78212
作品 0
厦门
技术主管
加载中

评论(2)

海诺者
海诺者
一遍遍的运行,会报错的
xmut
xmut
请问楼主如何调试存储过程的
Mysql存储过程从0开始(上)

1、首先你要明白,mysql也是一种语言,他也可以编写程序,也是支持逻辑判断,if,elseif,else,switch,while等等的判断 2、mysql赋值一个变量的值操作:set @a = 1; 查看这个变量为select @a...

思梦教育
2017/11/13
0
0
MySQL数据库 写入大量数据如何实现?

项目中碰到这么一个问题:需要往MySQL数据库中的某个表(比如myTable)的所有字段(比如myID,myName,myNum,...,Record,Remark)插入数据。 由于字段太多,若写成存储过程的话,输入参数非常多,导...

hushaod
2013/12/23
3.7K
14
「mysql优化专题」90%程序员没听过的存储过程和存储函数教学(7)

第六篇我已经讲了关于表层次的优化,包括分表分库等。但是当一个大型系统在建立时,会发现,很多的SQL操作是有重叠的,个别计算是相同的,比如:业务系统中,计算一张工单的计算方式。当遇到...

java进阶架构师
2017/12/10
0
0
【数据库】编写存储过程

ps:课程要求 存储过程(MySQL在5.0以前不支持) SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,...

Zoe_2016
2016/11/22
25
0
mysql的数据储存过程入门小结

Mysql是网站里最常用的数据库(LNMP组合)。这里总结下Mysql命令行的使用同时简单介绍下mysql储存过程做个入门介绍。 1.Linux登录mysql的语法格式 mysql -h IP -u username -p 因为在本机上,...

熊猫88
2015/12/31
59
0

没有更多内容

加载失败,请刷新页面

加载更多

一个可能的NEO链上安全随机数解决方案

0x00 困境 链上安全随机数生成应该算是一个比较蛋疼的问题,哪怕你的系统再牛逼,合约程序困在小小的虚拟机里,哪怕天大的本事也施展不开。 更悲催的是,交易执行的时候,是在每一个节点都执...

暖冰
27分钟前
0
0
【大福利】极客时间专栏返现二维码大汇总

我已经购买了如下专栏,大家通过我的二维码你可以获得一定额度的返现! 然后,再给大家来个福利,只要你通过我的二维码购买,并且关注了【飞鱼说编程】公众号,可以加我微信或者私聊我,我再...

飞鱼说编程
今天
1
0
Spring5对比Spring3.2源码之容器的基本实现

最近看了《Spring源码深度解析》,该书是基于Spring3.2版本的,其中关于第二章容器的基本实现部分,目前spring5的实现方式已有较大改变。 Spring3.2的实现: public void testSimpleLoad(){...

Ilike_Java
今天
1
0
【王阳明心学语录】-001

1.“破山中贼易,破心中贼难。” 2.“夫万事万物之理不外于吾心。” 3.“心即理也。”“心外无理,心外无物,心外无事。” 4.“人心之得其正者即道心;道心之失其正者即人心。” 5.“无...

卯金刀GG
今天
2
0
OSChina 周三乱弹 —— 我们无法成为野兽

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ _刚刚好: 霸王洗发水这波很骚 手机党少年们想听歌,请使劲儿戳(这里) hahahahahahh @嘻酱:居然忘了喝水。 让你喝可乐的话, 你准忘不了...

小小编辑
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部