文档章节

mysql存储过程编写

z_jordon
 z_jordon
发布于 2015/04/14 11:50
字数 718
阅读 1197
收藏 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
粉丝 35
博文 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
MySQL 存储过程 自定义函数

一. 定义 存储过程 Procedure 是一组为了完成特定功能的 SQL 语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。存储过程中可以包含逻辑控制语句和数据操纵语...

千里明月
06/10
0
0
mysql的数据储存过程入门小结

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

熊猫88
2015/12/31
59
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JS三元运算示例

1. topFlag=topFlag ==0?1:0; 等于 if(topFlag=00){ topFlag=1; }else if(topFlag == 1){ topFlag=0; } 2. 5>3?alert('5大'):alert('3大'); 即 if(5>3){alert('5大')}else{alert('3大')}; 注......

森火
今天
0
0
利用Slf4j的MDC跟踪方法调用链

why? 一个web项目通常提供很多URL访问地址, 项目一般都是分层处理,例如Controller——>Service——>DAO。 如果想根据日志查看用户一次请求都走了哪些方法(多数是查错误)。 如果系统是多人...

杨春炼
今天
7
0
Maven介绍及安装

Maven介绍及安装 以下内容是本人早期学习时的笔记,可能比较详实繁琐,现在复习一下Maven,顺便将内容抛出来,供大家一起学习进步。 一、Maven简介 Maven是Apache旗下的一款项目管理工具,是...

星汉
今天
0
0
小程序Aes解密

主要步骤: 1、下载AES源码(JS版) 2、在小程序中新建一个公共的文件夹,把AES源码拷贝进去(注意:需要暴露接口 module.exports = CryptoJS;) 3、添加一个用于加密解密的公共JS,可取名为...

Mr_Tea伯奕
今天
0
0
Go实现文件传输(基本传输可用)

发送端 package mainimport ("fmt""os""net""io")func SendFile(path string, connect net.Conn){file, oerr :=os.Open(path)if oerr !=nil{fmt.Println("Open", oerr)......

CHONGCHEN
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部