14.6本章实例
本小节将在food表上创建名为food_price_count的存储过程。按照11.4小节中表11.1 和表11.2来创建food表。存储过程food_price_count有3个参数。输入参数为price_infol 和price_info2,输出参数为count。存储过程的作用是查询food表中食品单价高于price_info1且低于price_info2的食品种数,然后由count参数来输出。并且计算满足条件的单价的总和。
操作如下:
(1)按照11.4节的内容来创建food表,并插入记录。
(2)创建存储过程food_price_count。代码如下:
DELIMITER && CREATE PROCEDURE food_price_count (IN price_info1 FLOAT,IN price_info2 FLOAT, OUT count INT ) READS SQL DATA BEGIN DECLARE temp FLOAT; DECLARE match_price CURSOR FOR SELECT price FROM food; DECLARE EXIT HANDLER FOR NOT FOUND CLOSE match_price; SET @sum=0; SELECT COUNT(*) INTO count FROM food WHERE price>price_info1 AND price<price_info2 ; OPEN match_price; REPEAT FETCH match_price INTO temp; IF temp>price_info1 AND temp<price_info2 THEN SET @sum=@sum+temp; END IF; UNTIL 0 END REPEAT; CLOSE match_price; END && DELIMITER;
(3)使用CALL语句来调用存储过程。查询价格在2~18之间的食品种数。代码如下:
CALL food_price_count(2,18,@count);
代码执行结果如下:
mysql> CALL food_price_count(2,18,@count); Query OK, 0 rows affected (0.00 sec)
(4)使用SELECT语句查看结果。代码如下:
SELECT @count, @sum ;
其中,COUNT是存储过程的输出结果;sum是存储过程中的变量,sum中的值满足条件的单价的总和。代码执行结果如下:
mysql>SELECT @count,@sum; +--------+-------+ | @count | @sum | +--------+-------+ | 3 | 20 | +--------+-------+ 1 row in set (0.00 sec)
(5)使用DROP语句删除存储过程ood_price_count。代码如下:
DROP PROCEDURE food_price_count;
执行结果如下:
mysql> DROP PROCEDURE food_price_count; Query OK, 0 rows affected (0.00 sec)
可以通过SHOW CREATE PROCEDURE来查看存储过程。代码执行结果如下:
mysql> SHOW CREATE PROCEDURE food_price_count\G ERROR 1305 (42000): PROCEDURE food_price_count does not exist
这说明该存储过程已经删除。这个存储过程的功能也可以通过存储函数来实现。存储函数的代码如下:
DELIMITER && CREATE FUNCTION food_price_count1(price_info1 FLOAT,price_info2 FLOAT ) RETURNS INT READS SQL DATA BEGIN RETURN (SELECT COUNT(*) FROM food WHERE price>price_info1 AND price<price_info2 ); END && DELIMITER ;
存储函数只能返回一个值,所以只实现了计算满足条件的食品种数。使用RETURN来将计算的食品种数返回回来。调用存储函数与调用MySQL内部函数的方式是一样的。 调用存储函数的语句执行结果如下:
mysql> SELECT food_price_count1 (2,18); +-------------------------+ | food_price_count1(2,18) | +-------------------------+ | 3 | +-------------------------+ 1 row in set(0.00 sec)
删除存储函数是通过DROP FUNCTION来实现的。删除存储函数的语句执行结果 如下:
mysql> DROP FUNCTION food_price_count1; Query OK, 0 rows affected (0.00 sec)