数据库——存储过程和函数

本次作业基于Mac OS X系统下的mysql workbench软件完成

存储过程在数据库编程中也是一个重要的角色,其主要的能力在于能被编译好放到服务器中,在使用时直接call即可调用执行,既能简化操作又能节省时间,能在优化层面起到一个很好的作用。

实验内容

1、编写存储过程实现下列操作:
(1)查询某读者、某段时间的借阅信息。已知读者姓名,查询起始和终止时间,列出其所有借阅信息。
(2)实现简单的图书入库操作(包含主键的少量信息即可)
2、编写函数实现下列操作:
输入会员级别,返回该级别会员所借的图书总数量

解决方案

编写存储过程

(1)查询某读者、某段时间的借阅信息(已知读者姓名,查询起始和终止时间,列出其所有借阅信息

实现代码如下,其中 delimiter 是MySQL中的命令,这个命令与存储过程没什么关系,其作用就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。

1
2
3
4
5
6
7
8
9
10
USE `bookmis`;
DROP procedure IF EXISTS `borrow_book`;

DELIMITER $$
USE `bookmis`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `borrow_book`(in reader_id varchar(5),in starttime date,in endtime date)
BEGIN
select * from borrows where borrows.reader_id=reader_id and borrows.Date_borrow>=starttime and borrows.Date_return<=endtime;
END$$
DELIMITER ;

我们用代码

1
call borrow_book('r001','2016-01-01','2017-01-01')

来进行测试,成功输出了r001在指定时间的借阅信息:
Alt text

(2)实现简单的图书入库操作(包含主键的少量信息即可)

代码如下,插入的参数为 book_id , book_nameQuantity_in 三个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DELIMITER $$
USE `bookmis`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `entry`(in id varchar(5),in book_name varchar(15),in amount int)
BEGIN
if id in (select book_id from books) then
update books
set Quantity_in=Quantity_in+amount
where books.book_id=id;
else
insert into books(book_id,book_name,Quantity_in)
values (id,book_name,amount);
end if;
END$$
DELIMITER ;

由于存储过中写到了if条件判断,所以我们分别测试一下插入新书和插入旧书的结果。
首先是插入新书,执行代码

1
call entry('b009','test_book',12)

结果如下:
Alt text
Alt text
其次是插入旧书,执行代码

1
call entry('b001','并行计算',20)

结果如下:
Alt text

编写函数

(1)输入会员级别,返回该级别会员所借的图书总数量。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
DELIMITER $$
USE `bookmis`$$
CREATE DEFINER=`root`@`localhost` FUNCTION`show_vipbooks`(vip_level varchar(6)) RETURNS int(11)
DETERMINISTIC
BEGIN
declare sum int;
set sum = (select count(book_id) from readers,borrows
where readers.level=vip_level and readers.reader_id=borrows.reader_id
group by readers.level);
RETURN sum;
END$$
DELIMITER ;

我们拿金卡用户做测试,可以观察到金卡用户 r001,r004:
Alt text
r001,r004总共借阅了图书5本,分别是b001,b002,b001,b002,b006:
Alt text

执行代码:

1
select show_vipbooks('金卡')

函数执行结果如下:
Alt text

小结

存储过程和函数在课程设计和项目中都是一个比较重要的成分,其中很大一部分原因在于其代码的集成性。运用存储过程可以起到一个很好的简化代码的作用,只需一个入口参数即可实现重复的数据查询或数据定义的功能,比起繁琐的select语句,一个call起到的作用会更大,更何况其执行速度也得到了很好的优化。

小手一抖⬇️