存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后调用时不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。
MySQL存储函数(简称MySQL函数),是一种控制流程函数,属于数据库语言。
——百度百科
一、存储过程
在普通模式下获取数据,用户需要通过输入SQL指令与数据库进行交互;存储过程则是编写好的SQL指令,存储在数据库中,用户操作时只需调用存储过程,不用重新输入繁杂冗余的SQL指令。
那么,存储过程都有哪些优点呢?
(1)存储过程可以重复使用,减小开发人员的负担;
(2)对于网络上的服务器,可以减少网络流量,因为只需传输存储过程的名称即可;
(3)可以防止对表的直接访问,只需赋予用户对存储过程的访问权限。
在MySQL中,创建存储过程,使用CREATE PROCEDURE。
存储过程创建后,用CALL语句可以调用存储过程。在存储过程内还可以调用其他存储过程。
操作 | SQL命令 |
创建存储过程 | CREATE PROCEDURE 存储过程名(参数种类1 参数1 数据类型1,[…] BEGIN 具体的procedure(处理) END |
查看数据库中的存储过程 | SHOW PROCEDURE STATUS\G |
查看具体的存储过程 | SHOW CREATE PROCEDURE 存储过程名\G |
调用(执行)存储过程 | CALL 存储过程名(参数1,…); |
删除存储过程 | DROP PROCEDURE 存储过程名 |
变量声明 | DECLARE 变量名 数据类型; |
变量赋值 | SET 变量名= ; |
其中,参数种类包括IN,OUT和INOUT。IN表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出。
参数的数据类型可以是MYSQL数据库中的任意类型。
案例如下:
(1)带输入和输出参数的存储过程:
/* 如果存在指定存储过程名则删除 */
mysql> drop procedure if exists sp1;
Query OK, 0 rows affected
/* 设置分隔符为// */
mysql> delimiter //
mysql> create procedure sp1(in a int,in b int,out s int)
-> begin
-> set @ss=a+b;
/* 用@符号加变量名的方式定义一个变量,与declare类似 */
-> set s=@ss;
/* 语句体内可以执行多条sql,但必须以分号分隔 */
-> end//
Query OK, 0 rows affected
/* 将分隔符改回为分号; */
mysql> delimiter ;
/* 调用该存储过程,注意:输入参数是一个值,而输出参数则必须是一个带@符号的变量 */
mysql> call sp1(3,5,@ret);
Query OK, 0 rows affected
mysql> select @ret;
+------+
| @ret |
+------+
| 8 |
+------+
1 row in set
(2)既做输入又做输出参数的存储过程:
mysql> drop procedure if exists sp3;
Query OK, 0 rows affected
mysql> delimiter //
mysql> create procedure sp3(inout p int)
-> begin
-> if p=4 then
-> set @result=400;
-> else
-> set @result=500;
-> end if;
-> select @result;
-> end//
Query OK, 0 rows affected
mysql> delimiter ;
mysql> call sp3(@ret);
+---------+
| @result |
+---------+
| 500 |
+---------+
1 row in set
Query OK, 0 rows affected
mysql> set @ret=4;
Query OK, 0 rows affected
mysql> call sp3(@ret);
+---------+
| @result |
+---------+
| 400 |
+---------+
1 row in set
Query OK, 0 rows affected
二、存储函数
创建存储函数,需要使用CREATE FUNCTION语句,基本语法如下:
CREATE FUNCTION func_name([func_parameter])
RETURNS TYPE
[characteristics...]
CREATE FUNCTION为用来创建存储函数的关键字;func_name表示存储函数的名称
func_parameter为存储函数的参数列表,参数列表如下:
[IN|OUT|INOUT]PARAM_NAMETYPE
其中,IN表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出;
param_name表示参数名称;type表示参数类型,该类型可以是MYSQL数据库中的任意类型
RETURNS TYPE语句表示函数返回数据的类型;characteristics:指定存储函数的特性,取值与创建存储过程时相同。
示例:
mysql> delimiter //
mysql> create function test2()
-> returns varchar(50)
-> begin
-> return (select userName from user where id=2);
-> end //
Query OK, 0 rows affected
mysql> delimiter ;
mysql> select test2();
+---------+
| test2() |
+---------+
| root |
+---------+
1 row in set
三、总结
存储过程和存储函数都是存储在服务器端的SQL语句的集合,要使用这些已经定义好的存储过程和存储函数就必须要通过调用的方式来实现。
存储过程是通过CALL语句来调用的。而存储函数的使用方法与MySQL内部函数的使用方法是一样的。
执行存储过程和存储函数需要拥有EXECUTE权限;EXECUTE权限的信息存储在information_schema数据库下面的USER_PRIVILEGES表中。
存储过程和函数创建以后,可以查看存储过程和函数的状态和定义。
通过SHOW STATUS语句来查看存储过程和函数的状态,也可以通过SHOW CREATE语句来查看存储过程和函数的定义。
通过查询information_schema数据库下的Routines表来查看存储过程和函数的信息。
存储过程里面是可以调用其他存储过程的,使用CALL语句调用其他存储过程就可以了;存储过程参数列表里的参数名尽量不要和数据库中表的字段名一样,否则有可能出错;存储过程的参数可以使用中文,在定义存储过程的时候加上character set gbk就可以了。例:
CREATE PROCEDURE useInfo(IN u_name VARCHAR(50) CHARACTER SET gbk,OUT u_age INT);