存储过程

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)