MySQL存储过程和函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL存储过程和函数相关的知识,希望对你有一定的参考价值。

1,存储过程和函数的介绍:
*存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合.
*存储过程和函数的区别:
          &函数必须有返回值,而存储过程没有.
          &存储过程的参数可以是IN,OUT,INOUT类型,函数的参数只能是IN.
*使用存储过程和函数的优点:
          &存储过程只在创建时进行编译,SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库的执行速度.
          &简化复杂操作,结合事物一起封装.
          &具有复用性
          &安全性高,可指定存储过程的使用权.

 

2,创建和调用存储过程:

*创建语法:

           CREATE PROCEDURE sp_name(参数列表);

                    [特性...] 过程体

*创建语法说明:

           &存储过程的参数形式:[IN|OUT|INOUT] 参数名 类型

                    IN  输入参数
                    OUT 输出参数
                    INOUT 输入输出参数

          &特性:
                   LANGUAGE SQL:说明过程体部分是由SQL语言组成的,这也是数据库系统默认的语言.
                   [NOT] DETERMINISTIC:指明存储过程的执行结果是否确定.DETERMINISTIC表示结果是确定的.每次执行存储过程时,相同的输入会得到
                   相同的输出.NOT DETERMINISTIC表示结果是非确定的,相同的输入可能得到不同的输出.默认情况下,结果是非确定的.
                   {CONTAINS SQL|NO SQL|READS SQL DATA|MODIFY SQL DATA}:指明子程序使用SQL语句的限制.CONTAINS SQL表示子程序包含SQL语句,
                   但不包含读或写数据的语句;NO SQL表示子程序中不包含SQL语句;READS SQL DATA表示子程序中包含读数据的语句;MODIFY SQL DATA表
                   示子程序包含数据的写语句.默认情况下,系统会指定为CONTAINS SQL.
                   SQL SECURITY {DEFINER|INVOKER}:指明谁有权限来执行.DEFINER表示只有定义者自己才能够执行;INVOKER表示调用者可以执行.默认情况
                   下,系统指定的权限是DEFINER.
                   COMMENT ‘string‘:注释信息.

*修改定界符:
         &用mysql命令客户端DELIMITER命令来改变定界符,这样就允许在程序体中使用;
         &DELIMITER语法:
               DELIMITER//
               CREATE PROCEDURE 存储过程名(参数列表)
               BEGIN
               有效SQL语句
               END//
               DELIMITER;
*调用存储过程:
         &语法:
              CALL存储过程名(实际参数列表);

 

3,创建和调用函数
*创建语法:
         CREATE FUNCTION 函数名(参数列表) RETURNS 返回值类型
             [特性...] 函数体
*函数的参数形式: 参数名 类型
*调用:
         SELECT 函数名(实际参数列表);

 

4,查看存储过程和函数
*查看存储过程或函数的定义:
         SHOW CREATE {PROCEDURE|FUNCTION} sp_name;
*查看存储过程或函数的状态:
         SHOW {PROCEDURE|FUNCTION} STATUS [LIKE ‘pattern‘];

5,删除存储过程和函数
*一次只能删除一个存储过程或者函数:
         DROP {PROCEDURE|FUNCTION} [IF EXISTS] sp_name;

6,变量的使用

*变量的定义:

        &DECLARE 变量名 [,...] 变量类型 [DEFAULT值]

        &定义一个局部变量,该变量的作用范围只能在BEGIN...END之中,也可以用在嵌套的块中.

        &变量的定义必须写在复合语句的开头,并且在任何其它语句的前面.

*变量的赋值:

        &直接赋值: SET 变量名 = 表达式值或常量[,...];

        &将查询结果覆给变量(查询返回的结果只能有一行):

             SELECT 列名[,...] INTO 变量名 [,...] FROM 表名 WHERE 条件...;

*用户变量(弱类型):

         &定义:是由客户端定义的变量

         &声明形式:@变量名

         &赋值:

             SET @变量名=表达式 ;

             SELECT 值 INTO @变量名; 

         &注意:一个客户端定义的变量(用户变量)不能被其它客户端看到或使用,当客户端退出时,该客户端连接的

         所有变量将自动释放.

 

7,流程控制

*IF语句:

        &语法:

               IF 条件表达式 THEN

                 SQL语句块

                [ELSEIF 条件表达式 2 THEN SQL 语句块2]... 

                [ELSE SQL语句块3]

               END IF;

*CASE语句:

        &语法:

               CASE 表达式值 

                  WHERE 值1 THEN SQL语句块1;

                  [WHERE 值2 THEN SQL语句块2]...

                 [ELSE SQL语句块3]

                END CASE;   

*LOOP语句及跳转

         &语法:

               [开始标注:] LOOP 

                   语句块 

                END LOOP[结束标注]

         &注意:LOOP语句用来实现简单的循环;除非"开始标注"存在,否则"结束标注"不能被给出,并且如果两者都出现,它们必须是

         同样的.

*LEAVE label:

         用于从标签的流程控制构造中退出,它和BEGIN...END或循环一起被使用.

*ITERATE label:

         用于跳过当前循环的剩下的语句,直接进入下一轮循环;ITERATE只可以出现在LOOP,REPEAT,和WHILE语句内.

*REPEAT语句:

         &语法:

              [开始标注:]REPEAT

                    语句块

                    UNTIL 条件表达式

               END REPEAT[结束标注]

*WHILE语句:

         &语法:

              [开始标注:]WHILE 条件表达式 DO

                语句块

              END WHILE[结束标注]

 

 

8,定义条件和处理程序

*定义条件:指提前定义程序在执行过程中可能遇到的问题.

        &语法:

             DECLARE condition_name CONDITION FOR condition_value

             condition_value:

                    SQLSTATE [VALUE] sqlstate_value | mysql_error_code

*定义处里程序:指定义解决定义条件所发生的问题

        &语法:

            DECLARE handler_type HANDLER FOR condition_value[,....] sp_statement

            handler_type:

                 CONTINUE|EXIT|UNDO

            condition_value:

                  SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING

                     |NOT FOUND| SQLEXCEPTION | mysql_error_code

 

9,光标的使用

*定义及作用:查询语句可能查询出多条记录,在存储过程和函数中使用光标来逐条读取查询结果集中的记录

*声明光标:

         DECLARE cursor_name CURSOR FOR select_statement;

*打开光标:

         OPEN cursor_name;

*使用光标:

        FETCH cursor_name INTO var_name[,var_name....];

*关闭光标:

        CLOSE cursor_name;    

 

 

示例:

1,在food表上创建名为food_price_count的存储过程,该存储过程有三个参数:输入参数为price_info1和price_info2;

输出参数为count.存储过程的作用是查询food表中食品单价高于price_info1并且低于price_info2的食品种数,然后由

count参数来输出,并且计算满足条件的单价总和.

food表:

技术分享

  

 

以上是关于MySQL存储过程和函数的主要内容,如果未能解决你的问题,请参考以下文章

MySQL存储过程和函数

12.Mysql存储过程和函数

MySQL数据库之存储过程与存储函数

Mysql存储过程和函数

九MySQL存储过程和函数

MySQL存储过程和函数