Mysql存储过程案例集合
注:使用的工具为SQLyog
壹、while简单使用(替换字符串中的字符,和REPLACE效果一样)
注: 这里没有使用REPLACE函数
1、创建存储过程
DROP PROCEDURE IF EXISTS replaceStr;
DELIMITER $$
CREATE PROCEDURE `replaceStr`(INOUT oldStr VARCHAR(1024), IN replace1 VARCHAR(16), IN replace2 VARCHAR(16))
BEGIN
SET @i=0;
-- 获取参数replace1出现的次数
SET @count = CHAR_LENGTH(oldStr)-CHAR_LENGTH(REPLACE(oldStr, replace1, ''));
-- 先申明一个变量存放替换之后的字符串
SET @newStr = ''; WHILE @i <= @count
DO
SET @i=@i+1;
IF(@i != 1) THEN
SELECT CONCAT(@newStr, replace2, SUBSTRING_INDEX(SUBSTRING_INDEX(oldStr, replace1 ,@i), replace1 ,-1)) INTO @newStr;
ELSE
SELECT CONCAT(@newStr, SUBSTRING_INDEX(SUBSTRING_INDEX(oldStr, replace1, @i), replace1, -1)) INTO @newStr;
END IF; END WHILE;
-- 把替换之后的字符串赋给旧字符串变量
SET oldStr = @newStr;
END;
2、调用存储过程
SET @arrayStr = '1 2 3 4 5 6 7';
CALL replaceStr(@arrayStr, ' ', '-');
SELECT @arrayStr;
3、执行结果
1-2-3-4-5-6-7
贰、游标简单使用
1、建立一张学生表
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(256) DEFAULT NULL,
`class` varchar(256) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('', '张三', '1班');
INSERT INTO `student` VALUES ('', '李四', '2班');
INSERT INTO `student` VALUES ('', '王五', '3班');
INSERT INTO `student` VALUES ('', '麻子', '1班');
INSERT INTO `student` VALUES ('', '老王', '3班');
2、建立存储过程
DROP PROCEDURE IF EXISTS fors;
DELIMITER $$
CREATE PROCEDURE fors(OUT namess VARCHAR(1024))
BEGIN
DECLARE a VARCHAR(500);
DECLARE Done, nameCount INT DEFAULT 0 ;
DECLARE rs CURSOR FOR SELECT NAME FROM student;
DECLARE CONTINUE HANDLER FOR SQLSTATE '' SET Done = 1 ; -- 不申明结果为NULL
SET namess = ''; -- 打开游标
OPEN rs;
FETCH NEXT FROM rs INTO a;
REPEAT
SET nameCount = nameCount + 1 ;
IF(nameCount != 1 ) THEN
SELECT CONCAT(namess,',' , a) INTO namess;
ELSE
SELECT CONCAT(namess, a) INTO namess;
END IF;
FETCH NEXT FROM rs INTO a;
UNTIL Done END REPEAT;
CLOSE rs;
END
3、调用存储过程
CALL fors(@names); SELECT @names;
4、执行结果
张三,李四,王五,麻子,老王
叁、游标+while简单使用
1、建立一张学生表
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(256) DEFAULT NULL,
`class` varchar(256) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('', '张三', '1班');
INSERT INTO `student` VALUES ('', '李四', '2班');
INSERT INTO `student` VALUES ('', '王五', '3班');
INSERT INTO `student` VALUES ('', '麻子', '1班');
INSERT INTO `student` VALUES ('', '老王', '3班');
2、建立存储过程
DROP PROCEDURE IF EXISTS whileFor;
DELIMITER $$
CREATE PROCEDURE whileFor(OUT namess VARCHAR(1024))
BEGIN
DECLARE a VARCHAR(500);
DECLARE i , j , Done INT DEFAULT 0 ;
-- 申明游标
DECLARE rs CURSOR FOR SELECT NAME FROM student;
DECLARE CONTINUE HANDLER FOR SQLSTATE '' SET Done = 1 ;
SET namess = '' , i = 0 , j = 1;
-- 循环四次
WHILE (j < 5) DO
-- 如果不是第一次,我们这里加一个|区分
IF(j > 1) THEN
SELECT CONCAT(namess,'|') INTO namess;
END IF; -- 打开游标
OPEN rs;
FETCH NEXT FROM rs INTO a;
REPEAT
SET i = i + 1 ;
IF(i != 1 ) THEN
SELECT CONCAT(namess,',' , a) INTO namess;
ELSE
SELECT CONCAT(namess , a) INTO namess;
END IF; FETCH NEXT FROM rs INTO a;
UNTIL Done END REPEAT;
CLOSE rs;
SET j = j + 1;
SET Done = 0 ;
SET i = 0 ;
END WHILE;
END
3、调用存储过程
CALL whileFor(@names); SELECT @names;
4、执行结果
张三,李四,王五,麻子,老王|张三,李四,王五,麻子,老王|张三,李四,王五,麻子,老王|张三,李四,王五,麻子,老王
肆、游标+游标简单使用
1、建立一张学生表
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(256) DEFAULT NULL,
`class` varchar(256) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('', '张三', '1班');
INSERT INTO `student` VALUES ('', '李四', '2班');
INSERT INTO `student` VALUES ('', '王五', '3班');
INSERT INTO `student` VALUES ('', '麻子', '1班');
INSERT INTO `student` VALUES ('', '老王', '3班');
2、建立存储过程
DROP PROCEDURE IF EXISTS forFor;
DELIMITER $$
CREATE PROCEDURE forFor(OUT classNames VARCHAR(1024))
BEGIN
-- 班级名、姓名
DECLARE classs , namess VARCHAR(500);
-- 班级数量、该班级下面学生的数量、班级变量++、学生变量++
DECLARE classNumber , nameNumber, classCount , nameCount INT DEFAULT 0;
-- 建立两个游标,第一个游标用来存储班级、第二个用来存储学生姓名
DECLARE class_csr CURSOR FOR SELECT class FROM student GROUP BY class;
DECLARE name_csr CURSOR FOR SELECT NAME FROM student WHERE class = classs ;
-- 获取按班级分组之后的数量
SELECT COUNT(*) INTO classNumber FROM (SELECT COUNT(*) FROM student GROUP BY class) t;
SET classNames = '' ; -- 打开班级游标
OPEN class_csr;
-- 开始班级游标循环
class_loop: LOOP FETCH class_csr INTO classs ;
SET classCount = classCount +1 ;
IF(classCount != 1 ) THEN
SELECT CONCAT(classNames,',' , classs, '(') INTO classNames;
ELSE
SELECT CONCAT(classNames, classs, '(') INTO classNames;
END IF; -- 获取该班级下面学生的数量
SELECT COUNT(*) INTO nameNumber FROM student WHERE class = classs; -- 打开学生游标
OPEN name_csr;
-- 开始学生游标循环
name_loop: LOOP
FETCH name_csr INTO namess;
SET nameCount = nameCount +1 ; IF(nameCount != 1 ) THEN
SELECT CONCAT(classNames,',' , namess) INTO classNames;
ELSE
SELECT CONCAT(classNames , namess) INTO classNames;
END IF; -- 如果学生变量等于学生数量,那么就终止该游标(第一个)
IF(nameCount = nameNumber) THEN
LEAVE name_loop;
END IF;
-- 结束学生游标循环
END LOOP name_loop;
-- 关闭学生游标
CLOSE name_csr; SET nameCount = 0 ;
SELECT CONCAT(classNames , ')') INTO classNames; -- 如果班级变量等于班级数量,那么就终止该游标(第二个)
IF(classCount = classNumber) THEN
LEAVE class_loop;
END IF; -- 结束班级游标循环
END LOOP class_loop;
-- 关闭班级游标
CLOSE class_csr; END ;
3、调用存储过程
CALL forFor(@classNames); SELECT @classNames;
4、执行结果
1班(张三,麻子),2班(李四),3班(王五,老王)
Mysql存储过程案例集合的更多相关文章
- Oracle存储过程案例集合
注:使用的工具为PLSQL Developer 壹.while简单使用(替换字符串中的字符,和REPLACE效果一样) 注: 这里没有使用REPLACE函数 1.建立存储过程 CREATE OR RE ...
- mysql存储过程的初步学习及案例示例
存储过程 几个月前小编开始初步接触学习存储过程,当然是跟着大神的视频学习的,在学习的过程中自己也记录了一下笔记,如今整理一下,接下来我将从概念,优缺点以及语法和实际应用几方面为大家详细讲解一下存储过程 ...
- Mysql存储过程知识,案例--mysql存储过程基本函数
Mysql存储过程知识,案例: create procedure delete_setting(in p_settingid integer) begin delete from setting wh ...
- mysql存储过程编写-入门案例-遁地龙卷风
(-1)写在前面 这篇文章只是简要的叙述了mysql存储过程编写的基本概念. 我使用的mysql版本是5.7.9-log. 参照<<深入浅出MySQL>>. (0) delim ...
- J2EE之oracle、mysql存储过程调用
最近几天在研究hibernate.JPA对存储过程的调用,主要是针对有返回结果集的存储过程的调用方法,个人感觉存储过程是个好东西,虽然说heibernate对数据访问封装的比较不错,再加上他的缓存机制 ...
- Mysql 存储过程 + python调用存储过程 (内置函数讲解及定义摘抄)
定义 存储过程:就是为以后的使用而保存的一条或多条 MySQL语句的集合.可将其视为批文件,虽然它们的作用不仅限于批处理. 个人使用存储过程的原因就是因为 存储过程比使用单独的SQL语句要快 有如下表 ...
- MySQL 存储过程
MySQL 存储过程 存储过程是通过给定的语法格式编写自定义的数据库API,类似于给数据库编写可执行函数. 简介 存储过程是一组为了完成特定功能的SQL语句集合,是经过编译后存储在数据库中. 存储过程 ...
- MYSQL存储过程、游标、触发器
MySQL5 中添加了存储过程的支持. 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成 存储过程简单来说,就是为以后的使用而保存的一 ...
- mysql存储过程语法及实例
存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法-------------------- 一.创建存储过程cr ...
随机推荐
- hdu 1950 Bridging signals 求最长子序列 ( 二分模板 )
Bridging signals Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- com.alibaba.druid.pool.DruidDataSource
https://www.cnblogs.com/wuyun-blog/p/5679073.html DRUID介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PR ...
- FTP故障排除
1,ping 检查 IP是否通 禁PING可以使用TCPING 2,服务器端被动模式设置,可设置固定端口号,保证防火墙上该端口畅通 浏览器默认是主动模式 3,使用FLASHFXP软件可以监测到数据端口 ...
- Python抽象基类之声明协议
抽象基类之--声明协议 上回讲了Python中抽象基类的大概,相信大家对abcmeta以及什么是抽象基类已经有所了解.传送门 现在我们来讲讲抽象基类的另一个常用用法--声明协议 所谓声明协议,有点像J ...
- POJ 1584:A Round Peg in a Ground Hole
A Round Peg in a Ground Hole Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5741 Acc ...
- bzoj1415 NOI2005聪聪和可可
%%%http://hzwer.com/2819.html 先各种暴力搞出来p[x][y](从x到y下一个最近应该到达的位子) 然后就记忆化搜索??(雾) #include<bits/stdc+ ...
- cf 755D. PolandBall and Polygon
题意:把一个多边形往里面连对角线,然后问每次添加多边形被划分为几个部分 产生的部分就是新加对角线与原有对角线相交条数+1,用线段树(大雾)维护一下. #include<bits/stdc++.h ...
- 大二暑假第七周总结--开始学习Hadoop基础(六)
复习关于Hadoop的操作语句以及重点 Shell版 跳转目录到Hadoop: cd /usr/local/hadoop 启动Hadoop: ./sbin/start-dfs.sh 注意:Hadoop ...
- c 循环左移
char b[11] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'}; const int iShift = 4; for (int j = ...
- Python小数据池
一. id is == 二. 代码块 三. 小数据池 四. 总结 一,id,is,== 在Python中,id是什么?id是内存地址,那就有人问了,什么是内存地址呢? 你只要创建一个数据(对象)那么都 ...