注:使用的工具为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. spring boot 连接Mysql介绍

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  2. Web基础之Mybatis

    Web基础之Mybatis   对比JdbcTempalte,mybatis才能称得上是框架,JdbcTempalte顶多算是工具类,同时,对比Hibernate,Mybatis又有更多的灵活性,算是 ...

  3. 洛谷 P1504 积木城堡

    题目传送门 解题思路: 01背包. AC代码: #include<iostream> #include<cstdio> #include<vector> using ...

  4. java课程课后作业190530之找水王

    从题目中我们可以看出,水王有着相当严苛的条件才可以成为,那就是必须拥有一半的评论量才可以当上水王.当然这就是破题的关键,最简单的算法当然是用O(N平方)的复杂度的那种算法,但显然,我们需要的不是这种. ...

  5. java课程之团队开发冲刺阶段2.1

    一.总结昨天任务 1.由于使用的模拟器,自己没有安卓手机,所以在制作手机静音功能的时候有一些麻烦 2.功能没有完成 二.遇到的困难 1.安卓手机的静音功能分为五个部分的静音,需要每个都要静音 2.当在 ...

  6. PowerDesigner 破解版,汉化包!

    链接:https://pan.baidu.com/s/1R_6g6keo2Y4_V0c1ImeFbA  密码:ncju

  7. [XNUCA2019Qualifier]EasyPHP

    0x00 知识点 预期解中知识点: htaccess生效 如果尝试上传htaccess文件会发现出现响应500的问题,因为文件尾有Just one chance 这里采用# \的方式将换行符转义成普通 ...

  8. Vue 指令 v-text v-html

    有三个指令达到的效果是一样的 {{JS表达式}}  差值表达式 v-text="JS表达式" v-html="JS表达式"   //会自动解析tag js表达式 ...

  9. Codeforces 1290B/1291D - Irreducible Anagrams

    题目大意: 两串字符串 s 和 t 是否 anagrams(下文简称ANA) 的定义是: 是否能将 s 内的字母打乱顺序后再拼接得到 t 我们考虑互相ANA的两串字符串 s 和 t 我们称 t 是 s ...

  10. python try-except处理异常的常用方法分析

    在写python程序时遇到异常想要进行处理时,可以使用try-except来处理,例如: try: 语句1 语句2 . . 语句N except .........: do something ... ...