注:使用的工具为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存储过程案例集合的更多相关文章

  1. Oracle存储过程案例集合

    注:使用的工具为PLSQL Developer 壹.while简单使用(替换字符串中的字符,和REPLACE效果一样) 注: 这里没有使用REPLACE函数 1.建立存储过程 CREATE OR RE ...

  2. mysql存储过程的初步学习及案例示例

    存储过程 几个月前小编开始初步接触学习存储过程,当然是跟着大神的视频学习的,在学习的过程中自己也记录了一下笔记,如今整理一下,接下来我将从概念,优缺点以及语法和实际应用几方面为大家详细讲解一下存储过程 ...

  3. Mysql存储过程知识,案例--mysql存储过程基本函数

    Mysql存储过程知识,案例: create procedure delete_setting(in p_settingid integer) begin delete from setting wh ...

  4. mysql存储过程编写-入门案例-遁地龙卷风

    (-1)写在前面 这篇文章只是简要的叙述了mysql存储过程编写的基本概念. 我使用的mysql版本是5.7.9-log. 参照<<深入浅出MySQL>>. (0) delim ...

  5. J2EE之oracle、mysql存储过程调用

    最近几天在研究hibernate.JPA对存储过程的调用,主要是针对有返回结果集的存储过程的调用方法,个人感觉存储过程是个好东西,虽然说heibernate对数据访问封装的比较不错,再加上他的缓存机制 ...

  6. Mysql 存储过程 + python调用存储过程 (内置函数讲解及定义摘抄)

    定义 存储过程:就是为以后的使用而保存的一条或多条 MySQL语句的集合.可将其视为批文件,虽然它们的作用不仅限于批处理. 个人使用存储过程的原因就是因为 存储过程比使用单独的SQL语句要快 有如下表 ...

  7. MySQL 存储过程

    MySQL 存储过程 存储过程是通过给定的语法格式编写自定义的数据库API,类似于给数据库编写可执行函数. 简介 存储过程是一组为了完成特定功能的SQL语句集合,是经过编译后存储在数据库中. 存储过程 ...

  8. MYSQL存储过程、游标、触发器

    MySQL5 中添加了存储过程的支持. 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成  存储过程简单来说,就是为以后的使用而保存的一 ...

  9. mysql存储过程语法及实例

    存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法-------------------- 一.创建存储过程cr ...

随机推荐

  1. UVA - 1153 Keep the Customer Satisfied(顾客是上帝)(贪心)

    题意:有n(n<=800000)个工作,已知每个工作需要的时间qi和截止时间di(必须在此之前完成),最多能完成多少个工作?工作只能串行完成.第一项任务开始的时间不早于时刻0. 分析:按截止时间 ...

  2. 996.ICU 爆发,互联网从业者难逃“高薪陷阱”

    从 3 月 27 日开始,截止本文发稿,GitHub 上面的项目 996.ICU 的 Star 数量已经超过 18 万,这场由程序员发动的轰轰烈烈的公开反对 996 工作制的运动,早已突破互联网圈层而 ...

  3. windows driver 定时器的使用

    #include < Ntifs.h> #pragma warning(disable:4995) #pragma comment(lib, "Ntoskrnl.lib" ...

  4. 【golang】golang的一些知识要点

    特殊常量iota: 1.iota的值在遇到const关键字时将被重置为0 2.const中每新增一行常量声明将使iota计数一次,也就是自动加一. 3.iota只能在常量定义中使用. iota常见使用 ...

  5. sql拆分列 时间拆分 日、月、年

    我想 查看今日访问人数 需要分组查询 就得 时间拆分 这两天百度 方法有很多 substring ... 但是 我这一列 是时间类型: 可以直接用 DATEPART() 函数用于返回日期/时间的单独部 ...

  6. 微信小程序手绘地图实现之《Canvas》

    环境:微信SDK2.9+   + uniapp (可切换直接使用.map.js不限制环境) 正题: 先创建一个地图组件 <template> <view class="cu ...

  7. java课程之团队开发冲刺阶段2.6

    总结昨天进度: 1.总体的思路已经完成,代码也差不多了,只剩下对闹钟activity的设置 遇到的困难: 1.在设置震动的时候,对方法有点不太理解,所以使用的时候产生了错误,没有达到预期的效果 今天的 ...

  8. n以内的素数

    /* 问题描述: 质数又称素数.一个大于1的自然数,除了1和它自身外, 不能被其他自然数整除的数叫做质数: 问题分析: 素数只能被1和自身整除的数.判断一个数是不是素数, 是用2和这个数之间的所有的数 ...

  9. JavaBean和json数据之间的转换(一)简单的JavaBean转换

    1.为什么要使用json? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,因为其高性能.可读性强的原因,成为了现阶段web开发中前后端交互数据的主要数据 ...

  10. 51nod 1392:装盒子 匈牙利+贪心

    1392 装盒子 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题  收藏  关注 有n个长方形盒子,第i个长度为Li,宽度为Wi,我们需要把他们套放.注意一个盒子 ...