IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MySQL存储过程学习总结 -> 正文阅读

[大数据]MySQL存储过程学习总结

存储过程

存储过程与函数相似,定义一些sql语句的集合,可以避免重复编写相同的sql语句,直接调用写好的存储过程来执行这些sql,同时存储过程是在MySQL服务器中存储和执行的,可以减少客户端与服务器端的数据传输

创建存储过程

格式:

create procedure proc_name(proc_param)
begin
	routine_body 
end;

其中,
proc_name:存储过程名字;

proc_param:参数(由三部分组成),可以有多个参数,
格式(IN|OUT|INOUT param_name type),
参数一:IN为输入类型,OUT为输出类型,INOUT为输入/输出类型,三个选择其中之一;
参数二:param_name为参数名字;
参数三:type为参数类型;

routine_body:表示存储过程中的sql语句

【例】使用存储过程的方式,当学生表中删除一条学生记录的时候,成绩表中删除该学生的成绩,同时更新班级表中的人数

create procedure proc_delete_name(IN sid int)
begin
	declare cid int;	//定义变量
	select class_id into cid from student whrer id=sid; //查询学生对应的班级id,存入到变量中
	delete from student where id=sid;  //删除学生表里该学生的记录
	delete from grade where student_id=sid;  //删除成绩表中该学生的记录
	update class set student_count=student_count-1 where id=cid;
end;  //更新班级表中的人数

其中declare表示创建变量(declare name type),变量赋值有两种方式:

  1. 使用set方式:set name=expr;
  2. 使用查询语句赋值:select col_name into name from table_name where condition;

光标

当存储过程中查询语句查出多条结果,可以使用光标(游标)来逐条读取查询结果中的记录

1 声明光标
格式:

declare cursor_name CURSOR
for select_statement;

其中,cursor_name为光标的名字,select_statement为查询语句

2 打开光标
MySQL中是使用open来打开光标,格式:

open cursor_name;

3 使用光标
MySQL中使用fetch来使用光标,格式:

fetch cursor_name into var_name;

其中,var_name为参数名,将光标中查询出来的结果存入到参数中,参数可以有多个。

【例】查询学生数据,输出出来

create procedure proc_query_student(IN sid int,OUT sname varchar(5),OUT cid int)
begin
	declare tmp_name varchar(5);  //定义变量tmp_name
	declare tmp_cid int;	//定义变量tmp_cid
	declare done int default 0;  //定义结束标志符
	//创建光标,查询学生的姓名与班级id
	declare cur_student CURSOR for select name,class_id from student where id=sid;
	//当光标中的数据都读取完成后,done变为1
	declare continue handler for not found set done=1;
	open cur_student;	//打开光标
	select done;		//打印done
	FETCH cur_student into tmp_name,tmp_cid;  //把光标中的name和class_id存放到变量中
	select done;		//打印done
	close cur_student;  //关闭光标
	set sname=tmp_name,cid=tmp_cid;  //输出值
end;

4 关闭光标
使用close进行关闭游标,格式:

close cur_name;

流程控制

存储过程中也可以使用控制语句,包括IF语句、CASE语句、LOOP语句、LEAVE语句、ITERATE语句、REPEAT语句、WHILE语句

1 IF语句
【例】输入年龄,如果大于20,输出年龄+1,等于20输出年龄+2,否则输出年龄+3

create procedure proc_test_if(IN age int,OUT output int)
begin
	IF age>20 then set output=age+1;
	  ELSEIF age=20 then set output=age+2;
		ELSE set output=age+3;
	end if;
end;

2 CASE语句
【例】输入年龄,如果等于20,输出年龄+1,等于30输出年龄+2,等于30输出年龄+3

create procedure proc_test_loop(IN age int,OUT output int)
begin
	case age
		when 20 then set output=age+1;
		when 30 then set output=age+2;
		when 40 then set output=age+3;
end;

3 LOOP语句
loop可以实现循环,需要通过leave来跳出循环
【例】实现从1加到100

create procedure proc_test_loop(IN input int,OUT output int)
begin
	set @count=0;	//系统变量,设为0
	add_num:LOOP	//创建loop循环,标志名为add_num
		set @count=@count+1;
		select @count;	//打印count
		IF @count=100 then	 //count加到100时跳出循环
			LEAVE add_num;
		end if;
	end LOOP add_num;	//结束循环
end;

4 LEAVE语句
leave主要用于跳出循环,格式:leave label
label为循环标志名

5 ITERATE语句
iterate也是主要用于跳出循环,代表跳出本次循环,进入下一次循环
格式:iterate label
label为循环标志名

6 REPEAT语句
repeat代表满足某种条件,跳出循环
格式:

begin_label:repeat
	statement_list;
	until search_condition
end repeat begin_label

其中,begin_label为标志名;statement_list为循环体;search_condition为结束循环的条件

【例】实现从1加到100

create procedure proc_test_loop(IN input int,OUT output int)
begin
	set @count=0;	//系统变量,设为0
	add_num:REPEAT	//创建REPEAT循环,标志名为add_num
		SET @count=@count+1;
		UNTIL @count=100
	end REPEAT add_num;	//结束循环
end;

7 WHILE语句
while也是条件控制的循环语句,while是当满足某种条件时执行循环内的语句
格式:

begin_label:WHILE search_condition DO
	statement_list;
end WHILE begin_label

其中,begin_label为标志名;search_condition为开始循环的条件;
statement_list为循环体;

【例】实现从1加到100

create procedure proc_test_loop(IN input int,OUT output int)
begin
	set @count=0;	//系统变量,设为0
	add_num:WHILE @count<100 DO	//当count小于100时执行
		SET @count=@count+1;
	end WHILE add_num;	//结束循环
end;

查看存储过程

有三种方式查看存储过程

1 方式一
使用 show procedure status like 'pattern';
其中pattern为匹配的存储过程的名称,可以省略不写
查询存储过程
可查询出存储过程名字,创建时间,修改时间等信息

2 方式二
使用show create procedure proc_name;可查询出存储过程的创建语句
查看存储过程
3 方式三
从information_schema.Routines表中查询:
SELECT * FROM information_schema.Routines where ROUTINE_NAME='proc_name';
其中proc_name为存储过程或函数的名字,也可支持模糊查询
查看存储过程

删除存储过程

格式:drop procedure proc_name;

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-20 15:51:25  更:2021-09-20 15:54:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:30:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码