MySQL-存储过程

存储过程

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 STATUS4、查看存储过程定义 SHOW CREATE PROCEDURE sp_name5、调用存储过程 CALL sp_name ([ proc_parameter [,proc_parameter ...]]) CALL sp_name 说明:当无参时,可以省略"()",当有参数时,不可省略"()"6、存储过程修改 ALTER语句修改存储过程只能修改存储过程的注释等无关紧要的东西,不能修改存储过程体,所以要修改存储过程,方法就是删除重建7、删除存储过程 DROP PROCEDURE [IF EXISTS] sp_name8、存储过程优势 存储过程把经常使用的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: utf8collation_connection: utf8_general_ci Database Collation: utf8_general_ci1 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)

相关文章