迄今为止,咱们学过的大多数SQL语句都是针对一个或多个表的单条语句。可是并非全部的操做都是能够用一条语句来完成的,常常有一些操做是须要多条语句配合才能完成。咱们引入的存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户经过指定存储过程的名字并给定参数(若是该存储过程带有参数)来调用执行它。
简单来讲,存储过程就是为之后使用而保存的一条或多条SQL语句。可将其视为加强版的批处理文件。 html
使用存储过程的好处:
☐ 经过把处理封装在一个易用的单元中,能够简化复杂的操做。
☐ 不须要反复创建一系列的处理步骤,于是保证了数据的一致性。
☐ 简化了对变更的管理,这一点的延伸就是安全性。
☐ 存储过程一般以编译过的形式存储,因此DBMS处理命令所需的工做量少,提升了性能。mysql
建立语句:sql
通常形式:数据库
CREATE PROCEDURE([[IN |OUT |INOUT ] 参数名 数据类形...])
说明:
DELIMITER $$ DELIMITER; 用来定义分隔符,由于MySQL默认以";"为分隔符,若是咱们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,因此要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当作存储过程当中的代码,不会执行这些代码,用完了以后要把分隔符还原。安全
示例:
函数
说明:oop
CALL Avg_Price(); 执行刚建立的存储过程并显示返回的结果。由于存储过程其实是一种函数,因此存储过程名后须要有 () 符号(即便不传递参数也须要)。性能
说明:spa请注意只给出了存储过程名,并无书写()。code
在上面咱们简单地显示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 ;