mysql 存储过程基础_MYSQL:基础—存储过程

快速入门

理解:

迄今为止,我们学过的大多数SQL语句都是针对一个或多个表的单条语句。但是并不是所有的操作都是可以用一条语句来完成的,经常有一些操作是需要多条语句配合才能完成。我们引入的存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

简单来说,存储过程就是为以后使用而保存的一条或多条SQL语句。可将其视为增强版的批处理文件。

使用存储过程的好处:

☐ 通过把处理封装在一个易用的单元中,可以简化复杂的操作。

☐ 不需要反复建立一系列的处理步骤,因而保证了数据的一致性。

☐ 简化了对变动的管理,这一点的延伸就是安全性。

☐ 存储过程通常以编译过的形式存储,所以DBMS处理命令所需的工作量少,提高了性能。

创建:

创建语句:

7e418733cdb191534b79d2c7ab3fd555.png

一般形式:

CREATE PROCEDURE([[IN |OUT |INOUT ] 参数名 数据类形...])

说明:

DELIMITER $$ DELIMITER; 用来定义分隔符,因为MySQL默认以";"为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。

调用:

示例:

2ab828ccf05a8f75858197ce3c419d22.png

说明:

CALL Avg_Price(); 执行刚创建的存储过程并显示返回的结果。因为存储过程实际上是一种函数,所以存储过程名后需要有 () 符号(即使不传递参数也需要)。

删除:

bbed35872b0d14c988a70387b7dbf452.png

说明:

请注意只给出了存储过程名,并没有书写()。

使用参数

说明

在上面我们简单地显示SELECT语句的结果,一般存储过程并不显示结果,而是把结果返回给你指定的变量。

现在我们需求如下:

计算商品的最低,最高和平均价格,并保存到三个变量中。

创建存储过程

447b1619a1e5daba5cc4277b2a099f3f.png

调用此存储过程

5fd8df6712efc5f0cf82e3f6177ad5e6.png

使用IN参数传入条件

创建存储过程:

ad0c01e875c653deef2aa5f88a061051.png

调用存储过程:

1147500f7a164f52822aabb1284a11ab.png

更加智能的存储过程

说明:

迄今为止使用的所有存储过程基本上都是封装MySQL简单的 SELECT语句。虽然它们全都是有效的存储过程例子,但它们所能完成的工作你直接用这些被封装的语句就能完成(如果说它们还能带来更多的东西,那就是使事情更复杂)。只有在存储过程内包含业务规则和智能处理时,它们的威力才真正显现出来,来使我们的语句执行更加可靠和智能,比如我们可以声明局部变量、添加内部注释、使用循环或判断语句等等。

实例:

8e09e6975fd5a6672c846a600aa735f8.png

常用控制语句及示例

强调:这里部分内容参考自王者佳暮的新浪博客。

(1). 条件语句

Ⅰ. if-then -else语句

48304ba5e6f9fe08f3fa1abda7d326ab.png

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 ;

48304ba5e6f9fe08f3fa1abda7d326ab.png

Ⅱ. case语句:

48304ba5e6f9fe08f3fa1abda7d326ab.png

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 ;

48304ba5e6f9fe08f3fa1abda7d326ab.png

(2). 循环语句

Ⅰ. while ···· end while:

48304ba5e6f9fe08f3fa1abda7d326ab.png

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 ;

48304ba5e6f9fe08f3fa1abda7d326ab.png

Ⅱ. repeat···· end repeat:

它在执行操作后检查结果,而while则是执行前进行检查。

48304ba5e6f9fe08f3fa1abda7d326ab.png

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 ;

48304ba5e6f9fe08f3fa1abda7d326ab.png

Ⅲ. loop ·····end loop:

loop循环不需要初始条件,这点和while 循环相似,同时和repeat循环一样不需要结束条件, leave语句的意义是离开循环。

48304ba5e6f9fe08f3fa1abda7d326ab.png

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 ;

48304ba5e6f9fe08f3fa1abda7d326ab.png

Ⅳ. LABLES 标号:

标号可以用在begin repeat while 或者loop 语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。

(3). ITERATE迭代

Ⅰ. ITERATE:

通过引用复合语句的标号,来从新开始复合语句

48304ba5e6f9fe08f3fa1abda7d326ab.png

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 ;

48304ba5e6f9fe08f3fa1abda7d326ab.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值