存储过程:(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例子:

   

 posted on 2013-05-31 13:44  evencao  阅读(229)  评论(0编辑  收藏  举报