存储过程:(stored procedure):是一组有特定功能的SQL语句及特殊语句的集合,通过编译存在在服务器上,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
存储过程的优点:
1.存储程序对象的可执行部分可以用复合语句来编写。
2.存储过程被保存在服务器端,所以程序只在他们被创建的时候使用一次,这大大减少了网络开销。
3.它们可以把复杂的计算封装为程序单元,可以简单的通过名字来调用。
4.它们可以用来实现“标准化的操作计算”。
5.存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。
MySQL对于存储过程的开始是开始于MySQL5.0.0版本,这样大大提高了MySQL的应用性。
首先在复合语句中必须要考虑和解决这个问题:复合语句必须以分号(;)隔开,但是;是mysql的分隔符,MySQL默认在遇到(;)时是执行该语句。
Delimiter命令把mysql程序重定义为另一个字符或者字符串,这样存储程序就会将整个对象作为一条语句传递给服务器。例:
mysql> delimiter // 这句话就是讲;分隔符改成了// mysql> create procedure showtime() -> begin -> select 'current time is :',current_time; -> end // Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; 改回原来的;分隔符 mysql> call showtime(); 调用存储过程 +-------------------+--------------+ | current time is : | current_time | +-------------------+--------------+ | current time is : | 10:45:22 | +-------------------+--------------+ 1 row in set (0.00 sec)
使用存储过程的情况主要有两种:
a.只需要通过运算来实现某种效果而不需返回一个值。
b.运算的结果会返回多个结果集。
当然还有其他的很多情况。
存储过程的变量定义:DECLARE variable_name [,variable_name...] datatype [DEFAULT value];
例:DECLARE test_int int unsigned default 4000000;
DECLARE test_decimal decimal(4,1) DEFAULT '111.1';
DECLARE test_datetime datetime DEFAULT '1999-12-31 23:59:59';
变量赋值:SET 变量名 = 表达式值 [,variable_name = expression ...]
mysql> set @i=1; Query OK, 0 rows affected (0.00 sec) mysql> select @i; +------+ | @i | +------+ | 1 | +------+ 1 row in set (0.00 sec)
在存储过程中使用用户变量 ,注意:
①用户变量名一般以@开头
②滥用用户变量会导致程序难以理解及管理
MySQL存储过程的查询:我们像知道一个数据库下面有那些表,我们一般采用show tables;进行查看。那么我们要查看某个数据库下面的存储过程,是否也可以采用呢?
答案是,我们可以查看某个数据库下面的存储过程,但是是令一钟方式。
我们可以用
select name from mysql.proc where db=’数据库名’;
或者
select routine_name from information_schema.routines where routine_schema='数据库名';
或者
show procedure status where db='数据库名';进行查询。
如果我们想知道,某个存储过程的详细,那我们又该怎么做呢?是不是也可以像操作表一样用describe 表名进行查看呢?
答案是:我们可以查看存储过程的详细,但是需要用另一种方法:
SHOW CREATE PROCEDURE 数据库.存储过程名,就可以查看当前存储过程的详细。
存储过程的参数分为3种类型
a.in:调用者把一个值传递给过程,过程可以对这个值进行修改,但任何修改在过程返回后对调用者是不可见的。
b.out :调用者把一个值传递给过程,任何修改在过程返回后对调用者是可见的
c.inout:允许调用者想过程传递一个值。然后在取回一个值。
注:要想明确指定参数的类型,只要在前面加上就可以,默认为in。
Out 例子:
mysql> delimiter $ mysql> create procedure countof_student_by_sex(out p_male int,out p_female int) -> begin -> select count(*)from student where sex='M' into p_male; -> select count(*)from student where sex='F' into p_female; -> end $ Query OK, 0 rows affected (0.06 sec) mysql> delimiter ; mysql> call countof_student_by_sex(@p_male,@p_female); Query OK, 0 rows affected (0.05 sec) mysql> select @p_male,@p_female; +---------+-----------+ | @p_male | @p_female | +---------+-----------+ | 16 | 15 | +---------+-----------+ 1 row in set (0.00 sec)
in例子:
mysql> delimiter $ mysql> create procedure countof_student_male(in p_sex enum('M','F')) -> begin -> select count(* )from student where sex=p_sex; -> end $ Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> call countof_student_male('M'); +-----------+ | count(* ) | +-----------+ | 16 | +-----------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
inout例子: