一、创建存储过程与存储函数
1.创建存储过程(实现统计tb_borrow1数据表中指定图书编号的图书的借阅次数)
mysql> delimiter //
mysql> CREATE PROCEDURE proc_count(IN id INT,OUT borrowcount INT)
-> READS SQL DATA
-> BEGIN
-> SELECT count(*) INTO borrowcount FROM tb_borrow1 WHERE bookid=id;
-> END
-> //
Query OK, 0 rows affected (0.00 sec)
2.创建存储函数 (实现统计tb_borrow1数据表中指定图书编号的图书的借阅次数)
mysql> CREATE FUNCTION func_count(id INT)
-> RETURNS INT(10)
-> BEGIN
-> RETURN(SELECT count(*) FROM tb_borrow1 WHERE bookid=id);
-> END
-> //
Query OK, 0 rows affected (0.00 sec)
3.变量的引用
(1)局部变量(以DECLARE声明,仅在BEGIN至END范围内有效)
mysql> CREATE PROCEDURE proc_local()
-> BEGIN
-> DECLARE x CHAR(10) DEFAULT '外层';
-> BEGIN
-> DECLARE x CHAR(10) DEFAULT '内层';
-> SELECT x;
-> END;
-> SELECT x;
-> END;
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> CALL proc_local()//
+--------+
| x |
+--------+
| 内层 |
+--------+
1 row in set (0.00 sec)
+--------+
| x |
+--------+
| 外层 |
+--------+
1 row in set (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
(2)全局变量(不用声明即可使用,在整个过程中有效,以“@”作为起始字符)
mysql> CREATE PROCEDURE proc_glocal()
-> BEGIN
-> SET @t='外层';
-> BEGIN
-> SET @t='内层';
-> SELECT @t;
-> END;
-> SELECT @t;
-> END;
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> CALL proc_glocal()//
+--------+
| @t |
+--------+
| 内层 |
+--------+
1 row in set (0.00 sec)
+--------+
| @t |
+--------+
| 内层 |
+--------+
1 row in set (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
(3)为变量赋值(分为使用SET关键字为变量赋值和使用SELECT...INTO语句为变量赋值)
SET var_name=expr[,var_name=expr[...
从tb_bookinfo表中查询barcode为17120107的记录,将该记录下的price字段内容赋值给变量book_price
SELECT price INTO book_price FROM tb_bookinfo WHERE barcode='17120107';
4.光标的运用
通过MySQL查询数据库,其结果可能为多条记录。在存储过程和函数使用光标可以实现逐条读取结果集中的记录。光标必须声明在处理程序之前,且声明在变量和条件之后。
(1)声明光标
mysql> DECLARE cursor_book CURSOR FOR SELECT barcode,bookname,price FROM tb_bookinfo WHERE typeid=4;
(2)打开光标
OPEN cursor_book;
(3)使用光标
FETCH cursor_book INTO tem_barcode,tem_bookname,tem_price;
(4)关闭光标
CLOSE cursor_book;
二、存储过程和存储函数的调用
1.调用存储过程
mysql> select * from tb_borrow1;
+----+----------+--------+------------+------------+----------+--------+
| id | readerid | bookid | borrowTime | backTime | operator | ifback |
+----+----------+--------+------------+------------+----------+--------+
| 1 | 4 | 7 | 2018-04-19 | 2018-04-20 | mr | 1 |
| 2 | 4 | 7 | 2018-04-17 | 2018-04-18 | mr | 0 |
| 3 | 2 | 6 | 2018-04-19 | 2018-04-21 | mr | 0 |
+----+----------+--------+------------+------------+----------+--------+
3 rows in set (0.00 sec)
Query OK, 1 row affected (0.00 sec)
+--------------+
| @borrowcount |
+--------------+
| 2 |
+--------------+
1 row in set (0.00 sec)
2.调用存储函数
mysql> SET @bookid=7;
-> CALL func_count(@bookid);
-> //
Query OK, 0 rows affected (0.00 sec)
三、查看存储过程和函数
1.SHOW STATUS语句
mysql> SHOW FUNCTION STATUS LIKE 'func_count'\G
*************************** 1. row ***************************
Db: db_library
Name: func_count
Type: FUNCTION
Definer: root@localhost
Modified: 2018-04-19 09:01:09
Created: 2018-04-19 09:01:09
Security_type: DEFINER
Comment:
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
1 row in set (0.00 sec)
2.SHOW CREATE语句
mysql> SHOW CREATE PROCEDURE proc_count\G
*************************** 1. row ***************************
Procedure: proc_count
sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_count`(IN id INT,OUT borrowcount INT)
READS SQL DATA
BEGIN
SELECT count(*) INTO borrowcount FROM tb_borrow1 WHERE bookid=id;
END
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
1 row in set (0.00 sec)
四、修改存储过程和函数
mysql> ALTER PROCEDURE proc_count
-> MODIFIES SQL DATA
-> SQL SECURITY INVOKER;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW CREATE PROCEDURE proc_count\G
*************************** 1. row ***************************
Procedure: proc_count
sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_count`(IN id INT,OUT borrowcount INT)
MODIFIES SQL DATA
SQL SECURITY INVOKER
BEGIN
SELECT count(*) INTO borrowcount FROM tb_borrow1 WHERE bookid=id;
END
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
1 row in set (0.00 sec)
五、删除存储过程和函数
mysql> DROP PROCEDURE proc_count;
Query OK, 0 rows affected (0.01 sec)
mysql> DROP FUNCTION func_count;
Query OK, 0 rows affected (0.00 sec)