存储过程基本语法

时间:2022-07-17 14:04:14

  存储过程就是一条或多条SQL语句的集合,可视为批文件,但作用不仅限于批处理,本文介绍如何创建存储过程以及变量的使用,如何调用、查看等。

创建语法如下:

          create procedure sp_name([proc_parameter]) (characteristics ...)  routine_body

pro_parameter:参数列表,

列表形式:[in|out|inout]  param_name  type

characteristics:存储过程的特性,有以下取值

        language sql:说明toutine_body部分是由sql组成;

        [not] deterministic:指明相同的输入是否会得到相同的输出,deterministic表示结果确定,not deterministic表示不确定,默认为not deterministic;

        {contains sql | not sql | reads sql data | modifies sql data}:指明子程序使用sql的限制,其中contains sql指不包含读写数据的sql语句;not sql表示不包含sql语句;reads sql data说明子程序包含读数据的语句;modifies sql data表明子程序包含写数据的语句。默认contains sql。

        sql security {definer | invoker}:指明谁有权限来执行,definer表示只有定义者才能执行,invoker 表示拥有权限的调用者可以执行,默认情况下为definer。

        comment  'String':注释信息,可以用来描述存储过程。

routine_body:sql代码内容,用Begin ...  End来表示sql代码的开始和结束。

 

举个简单的应用例子,有表为fruits存有单价、名称等,创建存储过程返回所有水果的评均价格,代码如下:

        create procedure AvgFruitPrice(out param1 int)

        Begin 

           select avg(f_price) into param1 from fruits;

          End;

变量的使用

    1.定义变量,语法如下:

        Delare var_name [,var_name] ... date_type[DEFAULT value];

        var_name是局部变量名称,DEFAULT value子句为变量提供初始值。

    2.为变量赋值,语法格式如下:

        Set var_name = expr1[,var_name = expr2] ...;

声明三个变量,分别为var1,var2,var3,数据类型为int,使用set为变量赋值,代码如下:

        Declare var1, var2, var3 int;

        Set var1=10, var2=20;

        Set var3 = var1 + var2;

还可以通过select ... from为一个变量赋值:select col_name[, ...] into var_name[, ...]  from table where...。

 

流程控制的使用

    1.IF语句,语法格式如下:

        IF expr_condition THEN statement_list

          [ELSEIF expr_condition THEN statement_list]...

          [ELSE statement_list]

        END IF

    2.case语句,语法格式如下:

       CASE case_expr

          WHEN when_value THEN statement_list

          [WHEN when_value THEN statement_list]...

          [ELSE statement_list]

        END CASE

    3.LOOP语句(循环操作的过程),语法格式如下:

      [loop_label:] LOOP

        statement_list

      END LOOP [loop_label]

    4.LEAVE语句

      LEAVE语句用来退出循环。

        Delare id int default 0;

        add_loop:LOOP

          SET id = id + 1;

            IF id >= 10 THEN LEAVE add_loop;

            END IF;

        END LOOP add_loop;

    5.ITERATE 语句,语法形式:ITERATE label

      该语句只能出现在循环内,意为“再次循环”。

    6.REPEAT语句

      该语句创建一个带条件判断的循环的过程,每次语句执行完毕,会对条件表达式进行判断,如果表达式为真,则循环结束,否则重复循环,语法形式如下:

        [repeat_label:] REPEAT

          statement_list

        UNTIL expr_condition

        END REPEAT [repeat_label]

                 repeat_label为标注名称(可省略),直至expr_condition条件为真,才会退出循环。

    7.WHILE语句

      该语句创建带条件判断的循环过程,与REPEAT语句不同,WHILE 执行语句时先对表达式进行判断,如果为真则执行循环内语句,否则退出循环,语法形式如下:

        [while_label:] WHILE expr_condition DO

          statement_list

        END WHILE [while_label]