MySQL存储过程

MySQL存储过程控制语句

变量作用域

内部的变量在其作用域范围内享有更高的优先权,当执行到end时,内部变量消失,此时已经在其作用域外,变量不再可见了,因为在存储过程外再也不能找到这个声明的变量,但是我们可以通过out参数或者将其值指派给会话变量来保存其值。

-- 创建存储过程                                                     
CREATE PROCEDURE PROC6()                                            
BEGIN                                                               
   DECLARE X1 VARCHAR(5) DEFAULT "OUTER";                           
   -- ----------嵌套块-------------------------                     
   BEGIN                                                            
       DECLARE X1 VARCHAR(5) DEFAULT "INNER";                       
       SELECT X1; -- 结果是"INNER"                                  
   END;                                                             
   -- -----------------------------------------                       
   SELECT X1; -- 结果是"OUTER"                                      
END;                                                                

-- 调用存储过程                                                     
CALL PROC6();     

执行结果如下:

条件语句

Ⅰ. if-then -else语句

创建一个表

CREATE TABLE TEMP (ID INT(4));

创建存储过程

CREATE PROCEDURE PROC7(IN PARAM INT)
BEGIN
  DECLARE VAR INT;
  SET VAR = PARAM + 1;
  -- ----------IF语句---------------
  -- 注意:判断var是否等于1,要使用=,而不是==;
  IF VAR = 1 THEN
     INSERT INTO TEMP VALUES (100);
  END IF;
  -- ----------IF ELSE语句---------------
  IF PARAM = 0 THEN 
     UPDATE TEMP SET ID = ID + 1;
  ELSE 
     UPDATE TEMP SET ID = ID + 2;
  END IF;
END;

调用存储过程

CALL PROC7(0);

查询结果:SELECT * FROM TEMP;

语句执行结果如下:

Ⅱ. case语句:

清空TEMP表中的记录

DELETE FROM TEMP;

创建存储过程

CREATE PROCEDURE PROC8(IN PARAM INT)
BEGIN
   DECLARE VAR INT;
   SET VAR = PARAM + 1;
   
   CASE VAR 
   WHEN 1 THEN 
     INSERT INTO TEMP VALUES (1);
   WHEN 2 THEN
     INSERT INTO TEMP VALUES (2);
   ELSE 
     INSERT INTO TEMP VALUES (100);
   END CASE; 
END; 

调用存储过程

CALL PROC8(10);

查询结果:SELECT * FROM TEMP;

语句执行结果如下:

循环语句

Ⅰ. while ···· end while:

清空TEMP表中的记录

DELETE FROM TEMP;

创建存储过程

CREATE PROCEDURE PROC9()
BEGIN
  DECLARE VAR INT DEFAULT 0;  
  WHILE VAR < 10 DO
    INSERT INTO TEMP VALUES (VAR);
    SET VAR = VAR + 1;
  END WHILE;
END;

调用存储过程

CALL PROC9();

查询结果:SELECT * FROM TEMP;

语句执行结果如下:

Ⅱ. repeat···· end repeat:

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

清空TEMP表中的记录

DELETE FROM TEMP;

创建存储过程

CREATE PROCEDURE PROC10()
BEGIN
   DECLARE VAR INT DEFAULT 0;
   REPEAT 
     INSERT INTO TEMP VALUES (VAR);
     SET VAR = VAR + 1;
     UNTIL VAR >= 10 -- 末尾没有分号
   END REPEAT;
END;

调用存储过程

CALL PROC10();

查询结果:SELECT * FROM TEMP;

语句执行结果:

Ⅲ. loop ·····end loop:

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

创建存储过程

CREATE PROCEDURE PROC11()
BEGIN
  DECLARE VAR INT DEFAULT 0;
  LOOP1:LOOP
     INSERT INTO TEMP VALUES (VAR);
     SET VAR = VAR + 1;
     IF VAR > 10 THEN  -- 循环终止条件
        LEAVE LOOP1;
     END IF;
  END LOOP;
END;
CALL PROC11(); -- 调用存储过程
SELECT * FROM TEMP;  -- 查询结果

语句执行结果如下: