迄今为止,我们学过的大多数 SQL 语句都是针对一个或多个表的单条语句。但是并不是所有的操作都是可以用一条语句来完成的,经常有一些操作是需要多条语句配合才能完成。我们引入的存储过程(Stored Procedure)是一组为了完成特定功能的 SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
简单来说,存储过程就是为以后使用而保存的一条或多条 SQL 语句。可将其视为增强版的批处理文件。
创建语句:
一般形式:
- CREATE PROCEDURE([[IN |OUT |INOUT ] 参数名 数据类形...])
示例:
在上面我们简单地显示 SELECT 语句的结果,一般存储过程并不显示结果,而是把结果返回给你指定的变量。
现在我们需求如下:
计算商品的最低,最高和平均价格,并保存到三个变量中。
创建存储过程:
调用存储过程:
迄今为止使用的所有存储过程基本上都是封装 MySQL 简单的 SELECT 语句。虽然它们全都是有效的存储过程例子, 但它们所能完成的工作你直接用这些被封装的语句就能完成 (如果说它们还能带来更多的东西, 那就是使事情更复杂)。只有在存储过程内包含业务规则和智能处理时, 它们的威力才真正显现出来,来使我们的语句执行更加可靠和智能,比如我们可以声明局部变量、添加内部注释、使用循环或判断语句等等。
(1). 条件语句
Ⅰ. if-then -else 语句
- mysql > DELIMITER //
- mysql > CREATE PROCEDURE proc2(IN parameter int)
- -> begin
- -> declare var int;
- -> set var=parameter+1;
- -> if var=0 then
- -> insert into t values(17);
- -> end if;
- -> if parameter=0 then
- -> update t set s1=s1+1;
- -> else
- -> update t set s1=s1+2;
- -> end if;
- -> end;
- -> //
- mysql > DELIMITER ;
Ⅱ. case 语句:
- mysql > DELIMITER //
- mysql > CREATE PROCEDURE proc3 (in parameter int)
- -> begin
- -> declare var int;
- -> set var=parameter+1;
- -> case var
- -> when 0 then
- -> insert into t values(17);
- -> when 1 then
- -> insert into t values(18);
- -> else
- -> insert into t values(19);
- -> end case;
- -> end;
- -> //
- mysql > DELIMITER ;
(2). 循环语句
Ⅰ. while ···· end while:
- mysql > DELIMITER //
- mysql > CREATE PROCEDURE proc4()
- -> begin
- -> declare var int;
- -> set var=0;
- -> while var<6 do
- -> insert into t values(var);
- -> set var=var+1;
- -> end while;
- -> end;
- -> //
- mysql > DELIMITER ;
Ⅱ. repeat···· end repeat:
它在执行操作后检查结果,而 while 则是执行前进行检查。
- mysql > DELIMITER //
- mysql > CREATE PROCEDURE proc5 ()
- -> begin
- -> declare v int;
- -> set v=0;
- -> repeat
- -> insert into t values(v);
- -> set v=v+1;
- -> until v>=5
- -> end repeat;
- -> end;
- -> //
- mysql > DELIMITER ;
Ⅲ. loop ·····end
loop:
loop 循环不需要初始条件,这点和 while 循环相似,同时和 repeat 循环一样不需要结束条件, leave 语句的意义是离开循环。
- mysql > DELIMITER //
- mysql > CREATE PROCEDURE proc6 ()
- -> begin
- -> declare v int;
- -> set v=0;
- -> LOOP_LABLE:loop
- -> insert into t values(v);
- -> set v=v+1;
- -> if v >=5 then
- -> leave LOOP_LABLE;
- -> end if;
- -> end loop;
- -> end;
- -> //
- mysql > DELIMITER ;
Ⅳ. LABLES 标号:
标号可以用在 begin repeat while 或者 loop 语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。
(3). ITERATE 迭代
Ⅰ. ITERATE:
通过引用复合语句的标号, 来从新开始复合语句
- mysql > DELIMITER //
- mysql > CREATE PROCEDURE proc10 ()
- -> begin
- -> declare v int;
- -> set v=0;
- -> LOOP_LABLE:loop
- -> if v=3 then
- -> set v=v+1;
- -> ITERATE LOOP_LABLE;
- -> end if;
- -> insert into t values(v);
- -> set v=v+1;
- -> if v>=5 then
- -> leave LOOP_LABLE;
- -> end if;
- -> end loop;
- -> end;
- -> //
- mysql > DELIMITER ;
来源: