存储过程
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)
文档更新时间: 2019-02-04 16:48 作者:李延召