仓库储存进程和函数,流程序调整制的使用

1. 光标的施用(游标卡塔 尔(阿拉伯语:قطر‎

经过前边的学习,已经掌握了创设存款和储蓄进程时所用到的基本知识,在编辑存款和储蓄进度时还也是有叁个可怜重要的有的——流程调控。流程序调节制语句用于将三个SQL语句划分或组合成切合业务逻辑的代码块。MySQL中的流程序调节制语句包罗:IF语句、CASE语句、LOOP语句、WHILE语句、LEAVE语句、ITERATE语句和REPEAT语句。

MySQL存款和储蓄进度中的3种循环

存款和储蓄进度和函数是先行经过编写翻译并蕴藏在数据库中的风华正茂段 SQL 语句的集结,调用存储进程和函数可以简化使用开垦职员的许多行事,减少数量在数据库和应用服务器之间的传导,对于增加数据处理的频率是有收益的

仓库储存进程和函数的分别在于函数必需有再次回到值,而存款和储蓄进度并未有,存款和储蓄进度的参数能够动用 in,out,inout 类型,而函数的参数只好是 in 类型的。尽管有函数从此外项指标数据库迁移到 MySQL,那么就也许为此须求将函数改变成存款和储蓄进程

  在蕴藏进程和函数中能够行使光标对结果集进行巡回的拍卖,光标使用蕴赤霄标的证明,open ,fetch,close。
  上面在蕴藏进度中采用叁个光标, 这几个比喻中光标里的逻辑不重大, 入眼在于如何运用光标:

各类流程中恐怕包蕴三个单独的语句,也大概是选拔BEGIN···END布局的复合语句,能够嵌套。接下来将照准存款和储蓄进度中的流程调整语句逐生机勃勃详细地讲学。

 

仓库储存进度和函数的连带操作

在对存款和储蓄进程或函数举办操作时,须要首先断定顾客是还是不是具有相应的权柄。举例,创造存款和储蓄进程可能函数须求CREATE ROUTINE 权限,改正或许去除存款和储蓄进度只怕函数必要 ALTEMurano ROUTINE 权限,实行存款和储蓄进度大概函数须求 EXECUTE 权限

SELECT city_id FROM test.city

IF语句

IF语句是指如若满足某种条件,就依据剖断的结果为TRUE或FALSE实行相应的言辞,其语法格式如下:

IF expr_condition THEN statement_list

    [ELSEIF expr_condition THEN statement_list]

    [ELSE statement_list]

END IF

IF达成了一个大旨的规范化结构。在上述语法布局中,expr_condition表示决断规范,statement_list表示SQL语句列表,它可以回顾多少个或七个语句。假使expr_condition求值为TRUE,相应的SQL语句列表就能够被试行;若无expr_condition相配,则ELSE子句里的讲话列表被实践。

必要小心的是,MySQL中还应该有两个IF(卡塔尔国函数,它差异于这里描述的IF语句。

接下去演示二个IF语句的用法,示例代码如下:

IF va1 IS NULL

    THEN SELECT 'va1 is NULL';

    ELSE SELECT 'va1 is  not NULL';

END IF;

上述代码中,推断val值是还是不是为空,要是val值为空,输出字符串“val is NULL”;不然输出字符串“val is not NULL”。需求留意的是,IF语句都急需接纳END IF来收场,不能不管。

图片 1

在MySQL存款和储蓄进度的话语中有四个正式的轮回格局:WHILE循环,LOOP循环以至REPEAT循环。还应该有一种非标准的循环方式:GOTO,可是这种循环情势最佳别用,非常轻松引起程序的烦琐,在那处就准确具体介绍了。

创立,修正存款和储蓄进度大概函数

CREATE PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body

CREATE FUNCTION sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body

    proc_parameter:[ IN | OUT | INOUT ] param_name type

    func_parameter:param_name type

    type:Any valid MySQL data type

    characteristic:LANGUAGE SQL| [NOT] DETERMINISTIC| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }| SQL SECURITY { DEFINER | INVOKER }| COMMENT 'string'

    routine_body:Valid SQL procedure statement or statements 

ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...]

    characteristic:{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }| SQL SECURITY { DEFINER | INVOKER }| COMMENT 'string'

调用进程的语法:CALL sp_name([parameter[,...]]);

调用函数与调用进度存在部分差距。可以以调用内置函数的同一方法调用二个存储函数 select functionname();

MySQL 的囤积进度和函数中允许包涵 DDL 语句,也同意在仓库储存进度中推行提交(Commit,即承认以前的改换卡塔 尔(阿拉伯语:قطر‎只怕回滚(Rollback,即甩掉早先的改换卡塔 尔(阿拉伯语:قطر‎,不过存款和储蓄进度和函数中不容许实践 LOAD DATA INFILE 语句。别的,存款和储蓄进程和函数中得以调用别的的经过或许函数

平时大家在执行创造进度和函数此前,都会因而 DELIMITER $$ 命令将讲话的了断符从 ; 更改成其它标记,这里运用的是 $$,那样在进程和函数中的 ; 就不会被 MySQL 解释成语句的扫尾而提示错误。在积存进度仍然函数创立完成,通过 DELIMITER ; 命令再将归西符改回成 ;

和视图的开创语法稍有两样,存款和储蓄进程和函数的 CREATE 语法不扶助接受 CREATE OR REPLACE 对存储进程和函数实行校勘,假如急需对已某个存款和储蓄进度只怕函数实行退换,要求实践 ALTER 语法

下面对 characteristic 特征值的有的开展简要的印证:

LANGUAGE SQL 表明下边进度的 BODY 是利用 SQL 语言编写,那条是系统私下认可的,为随后 MySQL 会扶持的除 SQL 外的此外语言援助的储存进程而筹划

DETERMINISTIC 明确的,即每一回输入同样输出也同样的前后相继

NOT DETERMINISTIC 非明确的,暗中认可井水不犯河水的。当前,这么些特征值还还没被优化程序采取。

{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } 这一个特色值提供子程序行使数据的内在音信,这几个特征值方今只是提须求服务器,并未依附那几个特点值来约束进度实际上行使数据的意况

CONTAINS SQL 表示子程序不分包读或写多少的口舌

NO SQL 表示子程序不富含 SQL 语句

READS SQL DATA 表示子程序满含读数据的言辞,但不含有写多少的讲话

MODIFIES SQL DATA 表示子程序满含写多少的说话。假若这个特色未有明了给定,暗许使用的值是 CONTAINS SQL

SQL SECURITY { DEFINER | INVOKER } 能够用来钦定子程序该用创立子程序者的许可来履行,依旧选用调用者的许可来推行。暗中认可值是 DEFINEWrangler

COMMENT 'string' 存款和储蓄进程只怕函数的讲明消息

  图片 2

CASE语句

CASE是另叁个实行标准化决断的讲话,该语句有二种语句格式,第风流罗曼蒂克种格式如下:

CASE case_expr

    WHEN when_value THEN statement_list

    [WHEN when_value THEN statement_list]...

    [ELSE statement_list]

END CASE

在上述语法格式中,case_expr表示原则判别的表达式,决定了哪五个WHEN子句会被实施;when_value代表表明式可能的值,即便有个别when_value表明式与case_expr表达式结果相符,则实行对应THEN关键字后的statement_list中的语句,statement_list表示差异when_value值的施行语句。

【例6-7】使用CASE流程序调控制语句的首先种格式,判定val值等于1、等于2,大概双方都不对等,语句如下:

CASE va1

    WHEN 1 THEN SELECT 'va1 is 1';

    WHEN 2 THEN SELECT 'va1 is 2';

    ELSE SELECT 'va1 is not 1 or 2';

END CASE;

在上述代码中,当val值为1时,输出字符串“val is 1”;当val值为2时,输出字符串“val is 2”;不然输出字符串“val is not 1 or 2”。

图片 3

CASE语句的第二种格式如下:

CASE

    WHEN expr_condition THEN statement_list

    [WHEN expr_condition THEN statement_list]

    [ELSE statement_list]

END CASE;

亟需小心的是,这里教书的用在蕴藏进程里的CASE语句与“调整流程函数”里描述的SQL CASE表明式中的CASE语句有个别区别。存款和储蓄进度里的CASE语句无法有ELSE NULL子句,并且用END CASE代替END来终止。

 

删去存款和储蓄过程依然函数

一遍只可以删除一个积攒进程恐怕函数,删除存款和储蓄进度也许函数供给有该进度依然函数的 ALTER ROUTINE 权限,具体语法如下:

DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name
DELIMITER $$
CREATE PROCEDURE proc_demo_cursor()
BEGIN
    -- 定义变量,获取光标中的数据
        DECLARE city_id_staff SMALLINT DEFAULT 0;

    -- 声明光标
    DECLARE cur_city CURSOR FOR SELECT city_id FROM test.city;

    -- 定义条件  没有找到数据时退出光标 NOT FOUND CLOSE cur_city
    DECLARE EXIT HANDLER FOR NOT FOUND CLOSE cur_city;    

    SET  @result=0;

    -- 打开光标
    OPEN cur_city;
    REPEAT
    FETCH  cur_city INTO city_id_staff;
         IF city_id_staff < 10 THEN 
         SET @result=@result 1;
         ELSE 
         SET @result=@result 2;
         END IF;
    UNTIL 0 END REPEAT;

    -- 关闭光标
    CLOSE cur_city;
END $$
DELIMITER ;

-- 调用
CALL proc_demo_cursor;
SELECT @result;

LOOP语句

LOOP循环语句用来重新推行有个别语句,与IF和CASE语句相比较,LOOP只是创办三个巡回操作的长河,并不开展标准剖断。LOOP内的言辞平素重复实行直到跳出循环语句。LOOP语句的主导格式如下:

[loop_label:]LOOP

    statement_list

END LOOP  [loop_label]

上述语法格式中,loop_label表示LOOP语句的表明名称,该参数能够轻巧;statement_list表示必要循环实施的口舌。

【例6-8】使用LOOP语句举行巡回操作,具体代码如下:

DECLARE id INT DEFAULT 0;

add_loop:LOOP

SET id=id 1;

    IF id>=10 THEN LEAVE add_loop;

    END IF;

END LOOP add_loop;

例中,循环实施了id加1的操作。当id值小于10时,循环重复推行;当id值大于恐怕等于10时,使用LEAVE语句退出循环。关于LEAVE语句将要上面举办详尽的任课。

这多少个循环语句的格式如下: WHILE……DO……END WHILE REPEAT……UNTIL END REPEAT LOOP……END LOOP GOTO。

翻看存款和储蓄进度或许函数

翻看存款和储蓄进程也许函数的情形

SHOW {PROCEDURE | FUNCTION} STATUS [LIKE 'pattern']

查阅存款和储蓄进度依旧函数的概念

SHOW CREATE {PROCEDURE | FUNCTION} sp_name

通过翻看 information_schema.Routines 通晓存款和储蓄过程和函数的新闻

图片 4

LEAVE语句

透过学习LOOP语句的选择可以知晓,当不满意循环条件时,必要动用LEAVE语句退出循环。LEAVE语句用于退出其余被标记的流程序调节制布局,其基本语法格式如下:

LEAVE label

在上述语法布局中,label表示循环的标记。平时状态下,LEAVE语句与BEGIN···END、循环语句一同使用。

图片 5

 

变量的施用

积存进度和函数中得以应用变量,变量是不区分朗朗上口写的

通过 DECLARE 可以定义一个局地变量,该变量的功效范围只可以在 BEGIN…END 块中,能够用在嵌套的块中。变量的定义必须写在复合语句的始发,並且在其余其余语句的前面。能够三遍注脚多个相似类其他变量。假诺急需,能够使用 DEFAULT 赋默许值

概念二个变量的语法如下:

DECLARE var_name[,...] type [DEFAULT value]

直接赋值使用 SET,能够赋常量恐怕赋表明式,具体语法如下:

SET var_name = expr [, var_name = expr] ...

也得以通过询问将结果赋给变量,那供给查询重回的结果必得只有大器晚成行,具体语法如下:

SELECT col_name[,...] INTO var_name[,...] table_expr

2. 流程序调节制

ITERATE语句

ITERATE的情致是双重循环、ITERATE语句用于将进行顺序转到语句段的开首处。使用ITERATE语句的基本语法格式如下:

ITERATE label

在上述语句构造中,label表示循环的标记。需求小心的是,ITERATE语句只可以够出今后LOOP、REPEAT和WHILE语句内。

【例6-9】演示了ITERATE语句在LOOP语句内的使用,具体代码如下:

CREATE PROCEDURE doiterate()

BEGIN

DECLARE p1 INT DEFAULT 0;

my_loop:LOOP

    SET p1=p1 1;

    IF p1<10 THEN ITERATE my_loop;

    ELSEIF p1>20 THEN LEAVE my_loop;

    END IF;

    SELECT 'p1 is between 10 and 20';

END LOOP my_loop;

END //

上述代码中,pl的开始值为0,借使pl的值小于10时,重复施行pl加1的操作;当pl大于或等于10而且小于20时,打字与印刷新闻“pl is between 10 and 20”;当pl大于20时,退出循环。

上边首先使用第黄金年代种循环编写八个例子。

概念法则和管理

原则的定义和拍卖能够用来定义在处理进度中遭受标题时相应的管理步骤

原则的概念

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

handler_typeCONTINUE 表示继续试行上面包车型地铁言语,EXIT 则表示施行终止

condition_value 的值能够是因此 DECLARE 定义的 condition_name,可以是 SQLSTATE 的值大概 mysql-error-code 的值可能 SQLWARNINGNOT FOUNDSQLEXCEPTION,那 3 个值是 3 种概念好的错误连串,分别表示分歧的意义:

  • SQLWARNING 是对负有以 01 最早的 SQLSTATE 代码的笔记
  • NOT FOUND 是对具备以 02 带头的 SQLSTATE 代码的笔记
  • SQLEXCEPTION 是对具有未有被 SQLWARNINGNOT FOUND 捕获的 SQLSTATE 代码的笔记

  包含 if ,case, loop, leave, iterate, repeat, while 语句举行流程序调节制

REPEAT语句

REPEAT语句用于创建四个包括条件决断的大循环过程,每一回说话推行完成之后,会对标准表达式进行判断,若是表达式为真,则循环结束;不然重复实施循环中的语句,REPEAT语句的基本语法格式如下:

[repeat_label:] REPEAT

    statement_list

UNTIL expr_condition

END REPEAT [repeat_label]

上述语法格式中,repeat_label为REPEAT语句的标记名称,该参数是可选的;REPEAT语句内的言辞或语句群被重复,直至expr_condition为真。

【例6-10】演示使用REPEAT语句推行循环进度,具体代码如下:

DECLARE id INT DEFAULT 0;

    REPEAT

    SET id=id 1;

    UNTIL id>=10;

END REPEAT;

mysql> create procedure pro10() -> begin -> declare i int; -> set i=0; -> while i<5 do -> insert into t1(filed) values(i); -> set i=i 1; -> end while; -> end;// Query OK, 0 rows affected (0.00 sec) 在此个事例中,INSERT和SET语句在WHILE和END WHILE之间,当变量i大于等于5的时候就淡出循环。使用set i=0;语句是为着以免万风姿浪漫叁个科学普及的失实,若无初步化,i暗许变量值为NULL,而NULL和任何值操作的结果都以NULL。 实行一下那几个蕴藏进程并产看一下试行结果: mysql> delete from t1// Query OK, 0 rows affected (0.00 sec) mysql> call pro10()// Query OK, 1 row affected (0.00 sec) mysql> select * from t1// ——- | filed | ——- | 0 | | 1 | | 2 | | 3 | | 4 | ——- 5 rows in set (0.00 sec) 以上正是实施结果,有5行数据插入到数据库中,注明存款和储蓄进度编写准确精确^_^。

光标的接受

在积累进程和函数中得以行使光标对结果集举行巡回的管理。光标的使用包蕴光标的扬言,OPEN, FETCH 和 CLOSE,其语法分别如下:

  • 宣示光标:

      DECLARE cursor_name CURSOR FOR select_statement
    
  • OPEN 光标:

      OPEN cursor_name
    
  • FETCH 光标:

      FETCH cursor_name INTO var_name [, var_name] ...
    
  • CLOSE 光标:

      CLOSE cursor_name
    

当心:变量、条件、管理程序、光标都是通过 DECLARE 定义的,它们中间是有先后顺序的渴求的。变量和原则必得在最前面注解,然后技巧是光标的扬言,最终才方可是处理程序的宣示

2.1  IF 语句

WHILE语句

WHILE语句创立叁个带条件决断的循环进程,与REPEAT不相同的是,WHILE在说话实践时,先对点名的表明式实行判断,如果为真,则进行循环内的话语,不然退出循环。WHILE语句的宗旨格式如下:

[while_label:] WHILE expr_condition DO

    Statement_list

END WHILE [while_label]

在上述语法格式中,while_label为WHILE语句的标号名称;expr_condition未进行剖断的表明式,借使表达式结果为真,WHILE语句内的讲话或语句群被推行,直至expr_condition为假,退出循环。

【例6-11】演示使用WHILE语句进行巡回操作,具体代码如下:

DECLARE i INT DEFAULT 0;

WHILE i<10 DO

SET i=i 1;

END WHILE;

 

流程序调控制

if 语句

if 完毕标准化判定,满意不一样的尺度履行分化的话语列表,具体语法如下:

IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF

CASE 语句

case 完毕比 if 更目不暇接一些的原则布局,具体语法如下:

CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE

Or:

CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE

loop 语句

LOOP 完成轻便的循环,退出循环的基准亟待动用别的的语句定义,平日能够使用 LEAVE 语句实现,具体语法如下:

[begin_label:] LOOP
statement_list
END LOOP [end_label]

黄金年代旦不在 statement_list 中追加退出循环的话语,那么 LOOP 语句能够用来落到实处轻松的死循环

leave 语句

用来从评释的流水生产线布局中脱离,常常和 BEGIN ... END 或然循环一起行使

iterate 语句

iterate 语句必得用在循环中,效用是跳过当前循环的多余的言语,直接踏向下意气风发轮循环

repeat 语句

有规范的巡回调控语句,当满意条件的时候退出循环,具体语法如下:

[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]

while 语句

WHILE 语句完结的也会有典型化的巡回调节语句,即当满意条件时实践循环的内容,具体语法如下:

[begin_label:] WHILE search_condition DO
statement_listEND WHILE [end_label]

WHILE 循环和 REPEAT 循环的分别在于:WHILE 是满足条件才实行循环,REPEAT 是满足条件退出循环;WHILE 在第二遍巡回奉行早先就评定标准,所以循环起码施行 0 次,而 REPEAT 是在第叁遍实行循环之后才看清规范,所以循环起码实施 1 次

--  语法如下
IF search_condition THEN statement_list
[ELSE IF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF
-- 举例
IF city_id_staff < 10 THEN 
    SET @result=@result 1;
ELSE 
    SET @result=@result 2;
END IF;

再来看一下一次之个巡回调节指令 REPEAT……END REPEAT。使用REPEAT循环调整语句编写上边那几个蕴藏进度:

事件调整器

事件调节器能够将数据库按自定义的年月周期触发某种操作,能够通晓为时间触发器

上面是二个最轻巧易行的风浪调整器,每 5 秒向表中插入数据

create event myevent
on schedule
every 5 second
do
insert into tablename values(value1);
  • 事件名称在 create event 关键字后钦点
  • 透过 on schedule 子句钦赐事件在曾几何时施行及实施频次
  • 因而 do 子句钦赐要实施的具体操作或事件

查看事件:show events;

查阅调节器:show variables like '%scheduler' 暗中认可是关门的

张开调整器:set global event_scheduler=1;,事件技能开发银行

查看后台进度:show processlist;

剥夺事件:alter event eventname disable;

删掉事件:drop event eventname;

2.2 CASE 语句

mysql> create procedure pro11() -> begin -> declare i int default 0; -> repeat -> insert into t1(filed) values(i); -> set i=i 1; -> until i>=5 -> end repeat; -> end;// Query OK, 0 rows affected (0.00 sec) 那一个REPEAT循环的效应和后面WHILE循环相似,不相同在于它的实践后检查是还是不是满意循环条件(until i>=5卡塔 尔(阿拉伯语:قطر‎,而WHILE则是奉行前检查(while i<5 do卡塔尔国。 但是要留神until i>=5后边不要加分号,假诺加分号,正是唤醒语法错误。 编写成功后,调用一下以此蕴藏进程,并查阅结果: mysql> delete from t1// Query OK, 5 rows affected (0.00 sec)

--  举例二种用法
CASE
WHEN i_staff_id = 2 THEN
    SET @x1 = @x1   d_amount;
ELSE
    SET @x2 = @x2   d_amount;
END CASE;
-- 或者:
CASE i_staff_id
WHEN 2 THEN
    SET @x1 = @x1   d_amount;
ELSE
    SET @x2 = @x2   d_amount;
END CASE;

 

2.3  loop 语句

mysql> call pro11()// Query OK, 1 row affected (0.00 sec) #就算在那处显得唯有生龙活虎行数据遭到震慑,可是上边采取数据来讲,依然插入了5行数据。

   loop 达成简单的循环,退出循环条件得以行使leave语句。

 

DELIMITER $$
CREATE PROCEDURE proc_demo_loop()
BEGIN
    DECLARE increase INT DEFAULT 1;
    SET @x=0;
    ins: LOOP
      SET increase=increase 1;  
      IF increase =100 THEN
        SET @x=increase;
        -- 退出
        LEAVE ins;
      END IF;

     END LOOP ins;    
END $$
DELIMITER ;

-- 调用
CALL proc_demo_loop;
SELECT @x;

mysql> select * from t1// ——- | filed | ——- | 0 | | 1 | | 2 | | 3 | | 4 | ——- 5 rows in set (0.00 sec) 后生可畏行正是实施结果,实际的效果和利用while编写的蕴藏进程相通,都以插入5行数据。

图片 6

 

2.4  ITERATE语句

再来看一下第八个巡回调整语句LOOP……END LOOP。编写二个囤积进程程序如下: mysql> create procedure pro12() -> begin -> declare i int default 0; -> loop_label: loop -> insert into t1(filed) values(i); -> set i=i 1; -> if i>=5 then -> leave loop_label; -> end if; -> end loop; -> end;// Query OK, 0 rows affected (0.00 sec) 从上边这一个例子能够看到,使用LOOP编写相像的轮回调节语句要比使用while和repeat编写的要复杂一些:在循环之中到场了IF……END IF语句,在IF语句中又步向了LEAVE语句,LEAVE语句的意思是偏离循环,LEAVE的格式是:LEAVE 循环标号。 编写完存款和储蓄进程程序后,来进行并查看一上周转结果: mysql> delete from t1// Query OK, 5 rows affected (0.00 sec)

  ITERATE该语句必得用在循环中,效率也正是for 中的continue, 跳过当前循环剩下的语句,直接步入下意气风发轮循环。

 

DELIMITER $$
CREATE PROCEDURE proc_demo_iterate()
BEGIN
    DECLARE increase INT DEFAULT 1;
    SET @x=0;
    ins: LOOP
      SET increase=increase 1;  
      IF increase =100 THEN
        -- 退出
        LEAVE ins;
      ELSEIF MOD(increase,2)=0 THEN
        -- 返回
        ITERATE ins;
      END IF;
      SET @x=@x 1;
     END LOOP ins;    
END $$
DELIMITER ;
-- 调用
CALL proc_demo_iterate;
SELECT @x;

mysql> call pro12// Query OK, 1 row affected (0.00 sec) #即便说独有生龙活虎行数据受影响,然而实际上是插入了5行数据。

  图片 7

 

2.5 repeat 语句

mysql> select * from t1// ——- | filed | ——- | 0 | | 1 | | 2 | | 3 | | 4 | ——- 5 rows in set (0.00 sec) 施行结果和动用WHILE、LOOP编写的巡回同样,都现在标中插入5行值。

  有原则的循环调控语句,当满意条件的时候退出循环,在地点的光标也是风流倜傥种循环,使用repeat来退出光标,使用close来关闭光标。

 

-- 语法
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]

--  举例(UNTIL 0 END REPEAT)退出 当search_condition为0时,使用END REPEAT退出
    REPEAT
    FETCH  cur_city INTO city_id_staff;
         IF city_id_staff < 10 THEN 
         SET @result=@result 1;
         ELSE 
         SET @result=@result 2;
         END IF;
    UNTIL 0 END REPEAT;

Labels 标号和 END Labels 结束标号 在行使loop的时候,使用到的labels标号,对于labels能够用到while,loop,rrepeat等循环调整语句中。而且有必不可少好好认知一下lables!! mysql> create procedure pro13() -> label_1:begin -> label2:while 0=1 do leave label2;end while; -> label3:repeat leave label3;until 0=0 end repeat; -> label4:loop leave label4;end loop; -> end;// Query OK, 0 rows affected (0.00 sec) 上边这里例子彰显了足以在BEGIN、WHILE、REPEAT恐怕LOOP语句前使用语句标号,语句标号只可以在法定的口舌前使用,所以LEAVE label3意味间距语句标号名称叫label3的说话或切合语句。 其实,也足以行使END labels来代表标号甘休符。 mysql> create procedure pro14() -> label_1:begin -> label2:while 0=1 do leave label2;end while label_2; -> label3:repeat leave label3;until 0=0 end repeat label_3; -> label4:loop leave label4;end loop label_4; -> end label_1;// Query OK, 0 rows affected (0.00 sec) 上面就是选拔了标记截至符,其实这么些停止标号并非老大有用,何况他必得和初阶定义的标号名字如出大器晚成辙,不然就可以报错。假使要养成三个精美的编制程序习于旧贯方便别人阅读的话,能够行使这一个标号结束符。

2.6 while 语句

 

   也会有准则的巡回调节语句,当满意条件的时候退出循环。WHILE 循环和REPEAT 循环的区别在于:WHILE 是知足条件才实践循环,REPEAT 是满意条件退出循环;WHILE 在第三回巡回实行在此以前就判别规范,所以循环起码实践0 次,而REPEAT 是在第一遍实行循环之后才看清标准,所以循环起码实施1 次。 也等于付出语言的while(bool) 和do while(bool)。

ITERATE 迭代 

DELIMITER $$
CREATE PROCEDURE proc_demo_while()
BEGIN
     DECLARE increase INT DEFAULT 1;
     SET @x=0;
     WHILE increase<=10 DO
     SET increase=increase 1;
     SET  @x=@x increase;
     END WHILE;
END $$
DELIMITER ;

-- 调用
CALL proc_demo_while;
SELECT @x;

例如是在ITERATE语句,即迭代语句中的话,就非得运用LEAVE语句。ITERATE只好出未来LOOP,REPEAT和WHILE语句中,它的意趣是“再度循环”,举个例子: mysql> create procedure pro15() -> begin -> declare i int default 0; -> loop_label:loop -> if i=3 then -> set i=i 1; -> iterate loop_label; -> end if; -> insert into t1(filed) values(i); -> set i=i 1; -> if i>=5 then -> leave loop_label; -> end if; -> end loop; -> end;// Query OK, 0 rows affected (0.00 sec) iterate语句和leave语句同样,也是在循环之中使用,它稍稍相符于C/C 语言中的continue。 那么那一个蕴藏程序是怎么运作的的?首先i的值为0,条件判别语句if i=3 then剖断为假,跳过if语段,向数据库中插入0,然后i 1,相符后边的if i>=5 then判断也为假,也跳过;继续循环,相仿插入1和2;在i=3的时候条件决断语句if i=3 then决断为真,实践i=i 1,i值为4,然后施行迭代iterate looplabel;,即语句实行到iterate looplabel;后平素跳到if i=3 then判定语句,实行剖断,此时是因为i=4,if i=3 then判定为假,跳过IF语段,将4增添到表中,i变为5,条件判别if i>=5 then判定为真,推行leave loop_label;跳出loop循环,然后试行end;//,截止全部存款和储蓄进程。 综上可得,数据库少将插入数值:0,1,2,4。实施存款和储蓄进度,并查阅结果:| mysql> delete from t1// Query OK, 5 rows affected (0.00 sec)

  图片 8

 

 

mysql> call pro15// Query OK, 1 row affected (0.00 sec)

 

mysql> select * from t1// ——- | filed | ——- | 0 | | 1 | | 2 | | 4 | ——- 4 rows in set (0.00 sec)

 

和我们地点解析的结果生龙活虎致,只插入了数值0,1,2,4。

 

在MySQL存款和储蓄进程的语句中有八个正经的巡回情势:WHILE循环,LOOP循环以致REPEAT循环。还会有生机勃勃种非标准的大循环格局:...

本文由星彩网app下载发布于星彩彩票app下载,转载请注明出处:仓库储存进程和函数,流程序调整制的使用

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。