本次作业基于Mac OS X系统下的mysql workbench软件完成
存储过程在数据库编程中也是一个重要的角色,其主要的能力在于能被编译好放到服务器中,在使用时直接call即可调用执行,既能简化操作又能节省时间,能在优化层面起到一个很好的作用。
实验内容
1、编写存储过程实现下列操作:
(1)查询某读者、某段时间的借阅信息。已知读者姓名,查询起始和终止时间,列出其所有借阅信息。
(2)实现简单的图书入库操作(包含主键的少量信息即可)
2、编写函数实现下列操作:
输入会员级别,返回该级别会员所借的图书总数量
解决方案
编写存储过程
(1)查询某读者、某段时间的借阅信息(已知读者姓名,查询起始和终止时间,列出其所有借阅信息
实现代码如下,其中 delimiter 是MySQL中的命令,这个命令与存储过程没什么关系,其作用就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。1
2
3
4
5
6
7
8
9
10USE `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在指定时间的借阅信息:
(2)实现简单的图书入库操作(包含主键的少量信息即可)
代码如下,插入的参数为 book_id , book_name 和 Quantity_in 三个1
2
3
4
5
6
7
8
9
10
11
12
13
14DELIMITER $$
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)
结果如下:
其次是插入旧书,执行代码1
call entry('b001','并行计算',20)
结果如下:
编写函数
(1)输入会员级别,返回该级别会员所借的图书总数量。
代码如下:1
2
3
4
5
6
7
8
9
10
11
12DELIMITER $$
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:
r001,r004总共借阅了图书5本,分别是b001,b002,b001,b002,b006:
执行代码:1
select show_vipbooks('金卡')
函数执行结果如下:
小结
存储过程和函数在课程设计和项目中都是一个比较重要的成分,其中很大一部分原因在于其代码的集成性。运用存储过程可以起到一个很好的简化代码的作用,只需一个入口参数即可实现重复的数据查询或数据定义的功能,比起繁琐的select语句,一个call起到的作用会更大,更何况其执行速度也得到了很好的优化。