【MySQL 第十一天 创建和存储|复合结构的存储|存储过程和函数的区别】
- 【1】mysql储存过程及语法结构
- 【1.1】mysql过程体
- 【2】mysql创建和使用存储过程
- 【2.1】mysql创建无参的存储过程
- 【2.2】mysql创建有参的输入输出存储过程
- 【3】mysql删除存储过程
- 【4】mysql创建复合结构的存储过程
- 【4.1】mysql if语句 存储过程
- 【4.2】mysql case语句 存储过程
- 【4.3】mysql floor和rand函数
- 【5】mysql 存储过程与函数的区别
开启前线学习模式,生命不止,学习不止
【1】mysql储存过程及语法结构
create procedure proc_name([proc_parameter])
[characteristics ...]routine_body
procedure :程序;步骤;
characteristics :特征;特性;特质;
routine_body:常规体
[IN]:输入参数
[OUT]:输出参数
[INOUT:输入输出参数]
type:数据类型
默认是IN输入参数类型
【1.1】mysql过程体
==调用存储过程使用 call ==
-- 创建存储过程
create procedure selectproc()
select book_id,book_name,price,store from bookinfo;
-- 调用存储过程
call selectproc();
参考表
存储过程的完整写法举例
-- 创建存储过程
delimiter //
create procedure selectproc()
begin
select book_id,book_name,price,store from bookinfo;
end//
delimiter ; -- 注意这里的分号前必须有空格
-- 调用存储过程
call selectproc();
【2】mysql创建和使用存储过程
【2.1】mysql创建无参的存储过程
-- 创建存储过程举例 无参数 存储的数据来自两张表 使用内连接
delimiter //
create procedure pro1()
begin
select bookinfo.book_id,bookinfo.book_name,bookparent.book_id from bookinfo
INNER join bookparent
on bookinfo.book_copy_id = bookparent.book_id;
end//
delimiter ;
-- 调用查看存储过程
call pro1;
【2.2】mysql创建有参的输入输出存储过程
读者信息表为例
-- 设计一个存储过程,删除一个读者,并输出剩余读者的个数。
delimiter //
create procedure pro2(in cid char(18), out num int)
begin
delete from readerinfo WHERE card_id = cid;
select count(card_id) into num from readerinfo;-- 获取剩余的读者数
end//
delimiter ;
-- 查看读者信息表
select *from readerinfo;
-- 调用存储过程 这个用户52214685259788被删除
call pro2('52214685259788',@num); -- @num获取里面的num值
-- 查看剩余读者
select @num; -- 去@出这个值
-- 设计一个存储过程,实现交换两个数的处理。
delimiter //
create procedure pro3(inout a int ,inout b int)
begin
declare t int default 0;
set t = a;
set a = b;
set b = t;
end//
delimiter ;
-- 设置变量值和传递参数
set @a = 100,@b = 200;
call pro3(@a,@b);
-- 查看
select @a,@b;
【3】mysql删除存储过程
-- 删除存储过程 完整写法
drop procedure if exists pro1;
-- 尝试同时删除多个
drop procedure pro2,pro3; -- 删除失败 只能一一删除
【4】mysql创建复合结构的存储过程
【4.1】mysql if语句 存储过程
-- 使用if语句 比较两个数的大小的存储过程
drop PROCEDURE if exists pro4;
delimiter //
create PROCEDURE pro4(in num1 int ,in num2 int ,out result varchar(30))
begin
if num1 = num2 then
set result = 'num1等于num2';
elseif num1>num2 then
set result = 'num1大于num2';
else
set result = 'num1小于num2';
end if ;
end//
delimiter ;
-- 查看和调用
call pro4(5,5,@result);
select @result;
【4.2】mysql case语句 存储过程
-- 使用case语句 比较两个数的大小的存储过程
drop PROCEDURE if exists pro4;
delimiter //
create PROCEDURE pro4(in num1 int ,in num2 int ,out result varchar(30))
begin
case
when num1 = num2 then set result = '等于';
when num1 > num2 then set result = '大于';
else set result = '小于';
end case;
end//
delimiter ;
-- 查看和调用
call pro4(5,5,@result);
select @result;
【4.3】mysql floor和rand函数
-- 获取随机数
select rand(); -- 十六位小数
select rand()*5; -- 0-5以内的十六位小数
-- floor获取指定数以内的整数 比如 5以内 0-4
select floor(rand()*5);
== 通过存储过程插入100条数据==
-- 通过存储过程向表中插入100条数据
delimiter //
create procedure pro12()
begin
declare n int default 8;
while n<=107 do
insert into book_bak values(n,concat('图书名称',n),floor(rand()*n));
set n = n+1;
end while;
end//
delimiter ;
-- 调用
call pro12();
select *from book_bak;
【5】mysql 存储过程与函数的区别
存储过程与函数的区别
参数的不同:
·存储过程:存储过程的参数类型有三种,IN、OUT、INOUT。
存储函数:参数类型只有一种,类似于IN参数。调用函数时需要按照参数的类型指定值即可。
存储过程与函数的区别
语法结构上的不同:·
存储过程:存储过程声明时不需要指定返回类型。
·存储函数:函数声明时需要指定返回类型,且在函数体中必须包含一个有效的RETURN语句。
== 本节结束,还有三章订阅不迷路==