MySQL数据库中的存储过程(第十一章)

1 存储过程的介绍

MySQL数据库中的存储过程(第十一章)_第1张图片
MySQL数据库中的存储过程(第十一章)_第2张图片
MySQL数据库中的存储过程(第十一章)_第3张图片
MySQL数据库中的存储过程(第十一章)_第4张图片

-- 创建一个查询图书的编号、书名、价格和库存的存储过程
delimiter //
create procedure selectPro1()
begin
select book_id, book_name, price, store from bookinfo;
end //
delimiter ;

call关键字调用存储过程:

-- 调用存储过程
call selectPro1();

结果:
MySQL数据库中的存储过程(第十一章)_第5张图片

2 创建和使用存储过程

MySQL数据库中的存储过程(第十一章)_第6张图片
MySQL数据库中的存储过程(第十一章)_第7张图片
MySQL数据库中的存储过程(第十一章)_第8张图片
MySQL数据库中的存储过程(第十一章)_第9张图片

-- 创建查询图书编号、书名、图书类别的存储过程
delimiter //
create procedure selectPro2()
begin
select book_id, book_name, category from bookinfo
join bookcategory on bookinfo.book_category_id = bookcategory.category_id;
end //
delimiter ;
-- 调用存储过程
call selectPro2();

结果:
MySQL数据库中的存储过程(第十一章)_第10张图片
MySQL数据库中的存储过程(第十一章)_第11张图片

-- 设计一个存储过程,删除一个读者,并输出剩余读者的个数
delimiter //
create procedure getReaderNum(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;
-- 定义一个变量@num接收剩余读者的个数
call getReaderNum('210210199901018888', @num);
-- 查询剩余读者的个数
select @num;

结果:
剩余读者的个数
MySQL数据库中的存储过程(第十一章)_第12张图片

-- 设计一个存储过程,实现交换两个数的处理
delimiter //
create procedure switchTwoNum(inout num1 int, inout num2 int)
begin
declare temp int default 0;
set temp = num1;
set num1 = num2;
set num2 = temp;
end //
delimiter ;
-- 声明2个变量并赋值
set @num1 = 3, @num2 = 5;
-- 调用存储过程
call switchTwoNum(@num1, @num2);
-- 执行存储过程之后的2个变量的值
select @num1, @num2;

结果:
交换2个变量的值
MySQL数据库中的存储过程(第十一章)_第13张图片

-- 删除存储过程:存在就删除,不存在就报错
drop procedure getReaderNum;
-- 使用If Exists 删除存储过程:存在就删除,不存在给与警告提示
drop procedure if exists switchTwoNum;

结果:
MySQL数据库中的存储过程(第十一章)_第14张图片

3 创建复合结构的存储过程

MySQL数据库中的存储过程(第十一章)_第15张图片

-- 设计比较两个数大小的存储过程
-- 方式1:使用if循环语句创建存储过程
delimiter //
create procedure compareNum(in num1 int, in num2 int, out result varchar(20))
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 ;
-- 设计比较两个数大小的存储过程
-- 方式1:使用case循环语句创建存储过程
delimiter //
create procedure compareNum1(in num1 int, in num2 int, out result varchar(20))
begin
case
	when num1 < num2 then
		set result = 'num1 小于 num2';
	when num1 = num2 then
		set result = 'num1 等于 num2';
	else
		set result = 'num1 大于 num2';
end case;
end //
delimiter ;
-- 调用存储过程
call compareNum(5, 10, @result);
-- 查看结果
select @result;

结果:
创建复合结构的存储过程并调用查看结果
MySQL数据库中的存储过程(第十一章)_第16张图片

-- 设计一个向图书类别表插入n条测试数据的存储过程
delimiter //
create procedure insertTestData(in count int)
begin
declare n int default 0;
select max(category_id) into n from bookcategory;
while count > 0 do
	set n = n + 1;
	insert into bookcategory values(n, concat('图书类别', n), floor(rand()*n));
    set count = count - 1;
    end while;
end //
delimiter ;
-- 调用存储过程,插入10条数据
call insertTestData(10);

结果:
MySQL数据库中的存储过程(第十一章)_第17张图片

4 存储过程与函数的区别

MySQL数据库中的存储过程(第十一章)_第18张图片
MySQL数据库中的存储过程(第十一章)_第19张图片
MySQL数据库中的存储过程(第十一章)_第20张图片
MySQL数据库中的存储过程(第十一章)_第21张图片
MySQL数据库中的存储过程(第十一章)_第22张图片

你可能感兴趣的:(MySql入门教程)