返回
软件
分类

表示变量x循环加1,  在存储过程和函数中可以使用光标对结果集进行循环的处理

日期: 2020-01-02 07:49 浏览次数 : 143

(13)mysql中的流程控制

概述

在mysql中可以使用if/case/loop/leave/iterate/repeat/while语句进行流程控制。

1. 光标的使用(游标)

概述

在mysql中可以使用if/case/loop/leave/iterate/repeat/while语句进行流程控制。

表示变量x循环加1,  在存储过程和函数中可以使用光标对结果集进行循环的处理。if语句

if语句实现条件判断,类似高级语言(c/c++/php/java等)中的if语句。

if search_condition then
    statement_list
[elseif search_condition then statement_list]...
[else statement_list]
end if

举例

if mobile='13911113222' and psw='720717' then
    set useridx = 10008888;
else if mobile='13911113333' and psw='720717' then
    set useridx = 10006666;
else
    select UserID into useridx from User_ID order by rand() limit 1;
end if;

  在存储过程和函数中可以使用光标对结果集进行循环的处理,光标使用包括光标的声明,open ,fetch,close。
  下面在存储过程中使用一个光标, 这个举例中光标里的逻辑不重要, 重点在于如何使用光标:

if语句

必赢备用网址 ,if语句实现条件判断,类似高级语言(c/c++/php/java等)中的if语句。

if search_condition then
    statement_list
[elseif search_condition then statement_list]...
[else statement_list]
end if

举例

if mobile='13911113222' and psw='720717' then
    set useridx = 10008888;
else if mobile='13911113333' and psw='720717' then
    set useridx = 10006666;
else
    select UserID into useridx from User_ID order by rand() limit 1;
end if;

case语句

case实现比if更复杂的一些分支选择,类似与高级语言中的 switch语句。

case case_value
    when when_value then statement_list
    [when when_value then statement_list]...
    [else statement_list]
end case

举例

case sid
    when 2 then
        set @x1 = 2;
    else
        set @x1 = 1;
end case
SELECT city_id FROM test.city

case语句

case实现比if更复杂的一些分支选择,类似与高级语言中的 switch语句。

case case_value
    when when_value then statement_list
    [when when_value then statement_list]...
    [else statement_list]
end case

举例

case sid
    when 2 then
        set @x1 = 2;
    else
        set @x1 = 1;
end case

loop、leave、iterate语句

  1. loop实习简单的循环,退出循环条件需要其他语句定义。类似与汇编中的loop,类似于高级语言中的goto语句。
#loop语法
[begin_label:] loop
statement_list
end loop [end_label]
  1. leave语句用来从流程结构中跳出来,类似于高级语言中的break语句。
  2. iterate语句用来跳过当前循环的剩下语句,直接进入下一轮循环。类似与高级语言中的continue语句。

举例

set @x=0;
set @x2=0;
ins:loop
    set @x=@x+1;
    if @x=10 then
        leave ins;
    elseif mod(@x,2)=0 then
        iterate ins;
    end if
    set @x2=@x2+1;
end loop ins;

上面的例子,表示变量x循环加1,当x=10,退出循环。当x取2的模不为0时候,变量x2加1。

  必赢备用网址 1

loop、leave、iterate语句

loop实习简单的循环,退出循环条件需要其他语句定义。类似与汇编中的loop,类似于高级语言中的goto语句。

#loop语法
[begin_label:] loop
statement_list
end loop [end_label]

leave语句用来从流程结构中跳出来,类似于高级语言中的break语句。 iterate语句用来跳过当前循环的剩下语句,直接进入下一轮循环。类似与高级语言中的continue语句。

举例

set @x=0;
set @x2=0;
ins:loop
    set @[email protected]+1;
    if @x=10 then
        leave ins;
    elseif mod(@x,2)=0 then
        iterate ins;
    end if
    set @[email protected]+1;
end loop ins;

上面的例子,表示变量x循环加1,当x=10,退出循环。当x取2的模不为0时候,变量x2加1。

repeat语句

repeat语句是有条件的循环控制语句,类似与高级语言中的do...while语句。

[begin_lable:] repeat
    statement_list
until search_condition
end repeat [end_lable]

举例

set @x=0;
repeat
    set @x = @x +1;
until @x>10 end repeat;
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;

repeat语句

repeat语句是有条件的循环控制语句,类似与高级语言中的do...while语句。

[begin_lable:] repeat
    statement_list
until search_condition
end repeat [end_lable]

举例

set @x=0;
repeat
    set @x = @x +1;
until @x>10 end repeat;

while语句

while语句是实现有条件的循环控制语句,类似与高级语言中的while语句。

[begin_label:] while search_condition do
    statement_list
end while [end_label]

举例

set @x=10;
while @x1<0 do
    set @x = @x-1;
end while;

流程控制在存储过程或函数中的运用,参考链接如下:
(9)mysql中的存储过程和自定义函数

必赢备用网址 2

while语句

while语句是实现有条件的循环控制语句,类似与高级语言中的while语句。

[begin_label:] while search_condition do
    statement_list
end while [end_label]

举例

set @x=10;
while @x1<0 do
    set @x = @x-1;
end while;

概述 在mysql中可以使用if/case/loop/leave/iterate/repeat/while语句进行流程控制。 if语句 if语句实现条件判断,类似高级语言(...

2. 流程控制

  包括 if ,case, loop, leave, iterate, repeat, while 语句进行流程控制

2.1  IF 语句

--  语法如下
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;

2.2 CASE 语句

--  举例二种用法
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 语句

   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;

必赢备用网址 3

2.4  ITERATE语句

  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;

  必赢备用网址 4

2.5 repeat 语句

  有条件的循环控制语句,当满足条件的时候退出循环,在上面的光标也是一种循环,使用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;

2.6 while 语句

   也是有条件的循环控制语句,当满足条件的时候退出循环。WHILE 循环和REPEAT 循环的区别在于:WHILE 是满足条件才执行循环,REPEAT 是满足条件退出循环;WHILE 在首次循环执行之前就判断条件,所以循环最少执行0 次,而REPEAT 是在首次执行循环之后才判断条件,所以循环最少执行1 次。 相当于开发语言的while(bool) 和do while(bool)。

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;

  必赢备用网址 5