zoukankan      html  css  js  c++  java
  • MySQL存储过程(2013531)

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

       

  • 相关阅读:
    世界疫情可视化开发(一)
    世界疫情可视化开发(三)-- world.jsp
    团队冲刺5
    课下作业1-扩展阅读
    团队冲刺4
    团队冲刺3
    冲刺个人感想
    团队冲刺开始
    Android Studio Toast(吐司)的基本使用
    GridLayout(网格布局)
  • 原文地址:https://www.cnblogs.com/evencao/p/3110249.html
Copyright © 2011-2022 走看看