一、创建存储过程与存储函数

  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)

最新文章

  1. 完善ecshop的mysql类
  2. ubuntu16.04中将python3设置为默认
  3. CentOS 7 安装 MySQL Database
  4. Elasticsearch mysql 增量同步 三表联合 脚本
  5. centos---无线上网的电脑所安装的虚拟机网络设置
  6. 防止ViewPager和Fragment结合使用时候的数据预加载
  7. [强连通分量] POJ 2762 Going from u to v or from v to u?
  8. WCF中因序列化问题引起的异常和错误。
  9. 我的JS 类 写法
  10. HW4.46
  11. Android 开源控件系列_1
  12. Android开发(22)--seekBar采用handler消息处理操作
  13. java运行时数据区域
  14. mysql进阶(二十一)删除表数据
  15. 移动端video不全屏播放
  16. 机器学习基础环境的安装与使用(MAC版)
  17. 偶尔用得上的Git操作
  18. CVE-2013-0025
  19. Java网络编程(二)关于Socket的一些个人想法
  20. 【大数据之数据仓库】HAWQ versus GreenPlum

热门文章

  1. Hadoop点滴-初识MapReduce(1)
  2. OpenGl 实现鼠标分别移动多个物体 ----------移动一个物体另外一个物体不动--读取多个3d模型操作的前期踏脚石
  3. spring cache常用注解使用
  4. App Crawler
  5. C# 读取控制台的Console.Write
  6. Python 爬虫(四):Selenium 框架
  7. 网页布局——Flex弹性框布局
  8. 简单cookie入侵
  9. iptables详解之filter
  10. 本人亲测-SSM整合后的基础包(供新手学习使用,可在本基础上进行二次开发)