注:使用的工具为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. junit基础学习之-断言注解(3)

    断言是编写测试用例的核心实现方式,即期望值是多少,测试的结果是多少,以此来判断测试是否通过. 断言核心方法 assertArrayEquals(expecteds, actuals) 查看两个数组是否 ...

  2. linux系统pid的最大值研究

    内核源码探查 通过对linux内核源码的追踪,可以看到对pid最大值的限定最终集中到include/linux/threads.h文件中的PID_MAX_DEFAULT上了,代码如下: /* * Th ...

  3. ls 查看文件

    1.按文件大小查看文件 a.降序:ls -lsh moudaen@morton:~$ ls -lshtotal 20M 20M -rw-r--r-- 1 moudaen 65536  20M Nov ...

  4. 【剑指Offer】面试题06.从尾到头打印链表

    题目 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 1000 ...

  5. Android-寒假学习-阶段总结(20集)-口算测试APP

    说在前面: 1.视频教程:https://www.bilibili.com/video/av60445113/?spm_id_from=333.788.videocard.0 2.老师的源码:http ...

  6. UVA - 11105 Semi-prime H-numbers(H-半素数)

    题意:所有形如4n+1(n为非负整数)的数叫H数.定义1是唯一的单位H数,H素数是指本身不是1,且不能写成两个不是1的H数的乘积.H-半素数是指能写成两个H素数的乘积的H数(这两个数可以相同也可以不同 ...

  7. Android file内部存储

    通过file=openFileOutput()获得,将数据存储在data/data/+包名+files下面. 代码如下: MainActivity.java: import android.os.Bu ...

  8. 十九、CI框架之数据库操作delete用法

    一.代码如下: 二.执行f访问 三.查看数据库,已经id=15的数据已经被删掉了 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477247)哦, ...

  9. Swift之分割视图控制器-UISplitViewController

    Swift之分割视图控制器-UISplitViewController UISplitViewController这种控制器只能用于iPad,它可以在iPad屏幕中显示两个不同的场景:在横向模式下,左 ...

  10. 浪潮服务器raid5-echo转义说明

    https://jingyan.baidu.com/article/4ae03de3e4c8d33eff9e6bee.html https://wenku.baidu.com/view/3c5dc9a ...