存储过程

1、存储过程:
		存储过程保存在mysql.proc表中
2、创建存储过程:
		CREATE PROCEDURE sp_name ([ proc_parameter [,proc_parameter ...]])
		routime_body
		其中:proc_parameter : [IN|OUT|INOUT] parameter_name type
		其中IN表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出;param_name表示参数名称;type表示参数的类型
3、查看存储过程列表:	
		SHOW PROCEDURE STATUS
4、查看存储过程定义
		SHOW CREATE PROCEDURE sp_name
5、调用存储过程
		CALL sp_name ([ proc_parameter [,proc_parameter ...]])
		CALL sp_name
	说明:当无参时,可以省略"()",当有参数时,不可省略"()"
6、存储过程修改
		ALTER语句修改存储过程只能修改存储过程的注释等无关紧要的东西,不能修改存储过程体,所以要修改存储过程,方法就是删除重建
7、删除存储过程
		DROP PROCEDURE [IF EXISTS] sp_name
8、存储过程优势
		存储过程把经常使用的SQL语句或业务逻辑封装起来,预编译保存在数据库中,当需要时从数据库中直接调用,省去了编译的过程
		提高了运行速度
		同时降低网络数据传输量
		存储过程相当于独立命令可以直接调用
9、存储过程与自定义函数的区别
		存储过程实现的过程要复杂一些,而函数的针对性较强
		存储过程可以有多个返回值,而自定义函数只有一个返回值
		存储过程一般独立的来执行,而函数往往是作为其他SQL语句的一部分来使用

存储过程示例:

MariaDB [hellodb]> delimiter //
MariaDB [hellodb]> CREATE PROCEDURE showTime()
    -> BEGIN
    -> SELECT now();
    -> END//
delimiter ;
Query OK, 0 rows affected (0.02 sec)

MariaDB [hellodb]> delimiter ;
MariaDB [hellodb]> CALL showTime;
+---------------------+
| now()               |
+---------------------+
| 2018-10-09 19:38:46 |
+---------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

查看存储过程:
MariaDB [hellodb]> show procedure status\G
*************************** 1. row ***************************
                  Db: hellodb
                Name: showTime
                Type: PROCEDURE
             Definer: root@localhost
            Modified: 2018-10-09 19:38:45
             Created: 2018-10-09 19:38:45
       Security_type: DEFINER
             Comment: 
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
1 rows in set (0.00 sec)

跨数据库是否能执行:
	1、MariaDB [hellodb]> use db1
	2、MariaDB [db1]> CALL showTime;
ERROR 1305 (42000): PROCEDURE db1.showTime does not exist
	3、MariaDB [db1]> call hellodb.showTime;
	+---------------------+
	| now()               |
	+---------------------+
	| 2018-10-09 19:43:15 |
	+---------------------+
	1 row in set (0.00 sec)

	Query OK, 0 rows affected (0.00 sec)

创建含参存储过程:只有一个IN参数
	MariaDB [db1]> delimiter ;
	MariaDB [db1]> call selectById(2);
	ERROR 1054 (42S22): Unknown column 'stuid' in 'where clause'
	MariaDB [db1]> call selectById(3);
	ERROR 1054 (42S22): Unknown column 'stuid' in 'where clause'
	MariaDB [db1]> use hellodb
	Database changed
	MariaDB [hellodb]> delimiter //					  
	MariaDB [hellodb]> CREATE PROCEDURE selectById(IN uid SMALLINT UNSIGNED)
	    -> BEGIN
	    -> SELECT * FROM students WHERE stuid = uid;
	    -> END//
	Query OK, 0 rows affected (0.00 sec)

	MariaDB [hellodb]> delimiter ;
	MariaDB [hellodb]> call selectById(2);
	+-------+------------+-----+--------+---------+-----------+
	| StuID | Name       | Age | Gender | ClassID | TeacherID |
	+-------+------------+-----+--------+---------+-----------+
	|     2 | Shi Potian |  22 | M      |       1 |         7 |
	+-------+------------+-----+--------+---------+-----------+
	1 row in set (0.02 sec)

	Query OK, 0 rows affected (0.02 sec)

计算的存储过程示例:
	# @i 变量
	# repeat 重复
	# @i = @i + 1 相当于shell脚本里面的i++

	MariaDB [hellodb]> delimiter //
	MariaDB [hellodb]> CREATE PROCEDURE dorepeat(n INT)
	    -> BEGIN
	    -> SET @i = 0;
	    -> SET @sum = 0;
	    -> REPEAT SET @sum = @sum+@i; SET @i = @i + 1;
	    -> UNTIL @i > n END REPEAT;
	    -> END//
	delimiter ;
	Query OK, 0 rows affected (0.02 sec)

	MariaDB [hellodb]> delimiter ;
	MariaDB [hellodb]> CALL dorepeat(100);
	Query OK, 0 rows affected (0.00 sec)

	MariaDB [hellodb]> SELECT @sum;
	+------+
	| @sum |
	+------+
	| 5050 |
	+------+
	1 row in set (0.00 sec)