文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL-存储过程、流程控制、游标

2023-10-11 06:16

关注

存储过程

存储过程概述

1.产生背景

2.解决办法

3.存储过程

4.编译

4.使用

存储过程入门案例

1.准备数据

DROP TABLE IF EXISTS student;CREATE TABLE student (sid CHAR(6),sname VARCHAR(50),age INT,gender VARCHAR(50) DEFAULT 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female');

2.编写存储过程

-- 改存储过程中依据指定年纪查询出符合条件的学生delimiter //create procedure procedureDemo01(in sage int)beginselect * from student where age>sage;end //delimiter ;

3.关键词解释

(1)DELIMITER //

(2)DELIMITER ;

(3)CREATE PROCEDURE 存储过程名称(参数)

(4)BEGIN END

4.调用存储过程

call procedureDemo01(15);

5.删除存储过程

drop procedure procedureDemo01;

存储过程的参数

1.传参分类

CREATE PROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类型...])

2.IN

-- findStudentByAge,该存储过程中有个IN参数,该参数为INT类型叫做sage delimiter //create procedure findStudentByAge(in sage int)beginselect * from student where age=sage;end //delimiter ;-- 调用存储过程call findStudentByAge(16);

3.用户变量

(1)语法

@var_name

(2)创建用户变量

SET 用户变量=初始值;

(3)查看用户变量值

SELECT 用户变量;

(4)注意

4.OUT参数

-- 存储过程countStudent,该存储过程中有个OUT参数,该参数为INT类型叫做total。-- 存储体中将统计的结果利用`INTO`存入total中。-- 调用存储过程中将用户变量@number作为参数传入,然后利用`SELECT @number`参看结果。delimiter //create procedure countStudent(out total int)beginselect count(*) into total from student;end //delimiter ;set @number=0;call countStudent(@number);select @number;

5.INOUT参数

-- 存储过程searchStudentGender,该存储过程中有个INOUT参数,该参数为VARCHAR(50)类型叫做message。-- message既当做输入参数又当做输出参数,即输入参数为学生的姓名lili返回的是学生的性别male。-- 调用存储过程时将初始值为lili的用户变量@info传入存储过程,调用存储过程结束后再次查询@info的值为male。 delimiter //create procedure queryStudentGender(inout message varchar(50))beginselect gender into message from student where sname=message;end //delimiter ;set @info='lili';call queryStudentGender(@info);select @info;

变量

1.使用场景

2.作用范围

3.语法

DECLARE varName dataType [DEFAULT value];

(1)变量赋值或修改变量值

SET varName = value;

(2)示例一

delimiter //create procedure varTest01(in number1 int)begin-- 声明变量declare number2 int;-- 声明变量resultdeclare result int;-- 为变量number2赋值set number2 = 99;-- 为变量result赋值set result = number1 + number2;-- 显示resultselect result;end //delimiter ;-- 调用存储过程call varTest01(1);

(2)示例二

-- 若存在存储过程findStudent,将之删除drop procedure if exists findStudent;delimiter //create procedure findStudent(in studentID char(6))begindeclare studentName varchar(59);declare studentGender varchar(50);-- 将查询结果保存至变量studentName和studentGender中select sname,gender into studentName,studentGender from student where sid=studentID;-- 显示studentName和studentGender中保存的值select studentName,studentGender;end //delimiter ;-- 调用存储过程call findStudent('S_1001');

流程控制

1.流程控制概述

2.流程控制语句

3.IF

(1)IF概述

(2)语法

IF expr_condition THEN statement_list    [ELSE expr_condtion THEN statement_list] ...    [ELSE statement_list]END IF

(3)示例代码

drop procedure if exists ifTest;delimiter //create procedure ifTest(in num int)begindeclare result varchar(20);if num < 0 then set result = 'negative number';elseif num = 0 thenset result = 'number is zero';else set result = 'positive number';end if;select result;end //delimiter;-- 调用存储过程call ifTest(-1);

4.CASE 语句

(1)CASE概述

(2)CASE语法格式一

CASE case_expr    WHEN  value THEN statement_list    [WHEN value THEN statement_list] ...    [ELSE statement_list]END CASE;

(3)CASE语法格式一示例

DROP PROCEDUREIFEXISTS testCase01;delimiter //create procedure testCase01(in num int)begindeclare result varchar(20);case numwhen num>0 set result = 'num is 正数';when num=0 set result = 'num is zero';else set result = 'num is 负数';end case;select result;end //delimiter ;call testCase01(1);

(4)CASE语法格式二

CASEWHEN expr_condition THEN statement_list[WHEN expr_condition THEN statement_list] ...    [ELSE statement_list]END CASE;

(5)CASE语法格式二示例

delimiter //create procedure testCase02(in num int)begindeclare result varchar(20);casewhen num > 0 then set result = 'positive number';when num = 0 then set result = 'number is zero';else set result = 'positive number';end case;select result;end //delimiter ;call testCase02(1);

5.LOOP语句

(1)LOOP语句概述

(2)LOOP语法

[loop_label:] LOOP    statement_listEND LOOP [loop_label]

(3)LOOP语句示例

delimiter //create procedure testLoop(in start1 int ,in end1 int)begindeclare sumResult int default 0;add_loop: loopset sumResult = sumResult + start1;set start1 = start1 + 1;if start1 > end1 then leave add_loop; end if; end loop add_loop; select sumResult;end //delimiter ;call testLoop(0,100);

6.ITERATE

(1)ITERATE概述

(2)ITERATE 语法

ITERATE label

(3)示例

DROP PROCEDURE IF EXISTS testITERATE; DELIMITER // CREATE PROCEDURE testITERATE(IN start1 INT,IN end1 INT) BEGIN DECLARE sumResult INT DEFAULT 0; add_loop: LOOP     SET sumResult=sumResult+start1;     SET start1=start1+1;    IF start1 <= end1 THEN         ITERATE  add_loop;     ELSE LEAVE add_loop;     END IF; END LOOP add_loop; SELECT sumResult; END //DELIMITER ;call testITERATE(0,100);

7.REPEAT

(1)REPEAT概述

(2)REPEAT语法

[repeat_label:] REPEAT    statement_listUNTIL expr_condtionEND REPEAT [repeat_label]

(3)REPEAT语法实例

 DELIMITER // CREATE PROCEDURE testREPEAT(IN start INT,IN end INT) BEGIN DECLARE sumResult INT DEFAULT 0; REPEAT     SET sumResult = sumResult + start;     SET start=start+1;UNTIL start > end END REPEAT;SELECT sumResult;END //DELIMITER ;call testREPEAT(0,100);

8.WHILE

(1)WHILE概述

(2)WHILE语法格式

[while_label:] WHILE expr_condition DO    statement_listEND WHILE [while_label]

(3)WHILE语法示例

DROP PROCEDURE IF EXISTS testWHILE;)DELIMITER //CREATE PROCEDURE testWHILE(IN start INT,IN end INT) BEGIN DECLARE sumResult INT DEFAULT 0; WHILE  start <= end DO     SET sumResult = sumResult + start;     SET start=start+1; END WHILE; SELECT sumResult; END //DELIMITER ;call testWHILE(0,100);

游标(cursor)

1.游标概述

2.游标使用步骤

(1)定义游标

declare 有标明 cursor for select_statement;

(2)打开游标

open 游标名;

(3)使用游标

declare 变量1 与对应列值相同的数据类型declare 变量2 与对应列值相同的数据类型declare 变量3 与对应列值相同的数据类型fetch next from 游标 [into 变量名1,变量名2,变量名3,...]

(4)关闭游标

close 游标名;

(5)释放游标

deallocate 游标名;

3.游标示例一

delimiter //create procedure cursorTest01()begin-- 声明与对应列类型相同的4个变量declare studentID char(6);declare studentName varchar(50);declare studentAge int;declare studentGender varchar(50);-- 定义游标studentCursordeclare studentCursor cursor for select * from student;-- 打开游标open studentCursor;-- 使用游标fetch next from studentCursor into studentID,studentName,studentAge,studentGender;-- 显示结果select studentID,studentName,studentAge,studentGender;-- 关闭游标close studentCursor;end //delimiter ;-- 调用存储过程call cursorTest01();

4.游标示例二

drop procedure if exists cursorTest02;delimiter //create procedure cursorTest02()begin-- 声明与对应列类型相同的4个变量declare studentID char(6);declare studentName varchar(50);declare studentAge int;declare studentGender varchar(50);-- 声明计数器declare count int default 0;declare total int default 0;-- 定义游标studentCursordeclare studentCursor cursor for select * from student;set total = (select count(*) from student);-- 打开游标open studentCursor;-- 使用游标-- 利用 REPEAT 语句循环取出结果集中的数据REPEATfetch next from studentCursor into studentID,studentName,studentAge,studentGender;-- 显示结果select studentID,studentName,studentAge,studentGender;set count = count + 1;until count = totalend repeat;-- 关闭游标close studentCursor;end //delimiter ;-- 调用存储过程call cursorTest02();

来源地址:https://blog.csdn.net/weixin_53903929/article/details/132586107

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯