MySQL基础(5) | 存储过程

MySQL基础(5) | 存储过程


一、基础

  1. 结束符【重要】

mysql的命令行执行每一条命令是以分号结尾的,也就是说识别是否为一条命令,是根据分号决定的。

然而存储过程中设计多条语句,很可能出现多个分号,所以直接把存储过程复制到命令执行一般都会失败。

解决方法是临时切换分隔符,让命令行知道整个存储过程的代码是完整的一块代码,如下:

DELIMITER $$
BEGIN
    select * from table_name;
END$$
  1. 声明存储过程
CREATE PROCEDURE demo_in_parameter(IN p_in int)    
  1. 存储过程开始和结束符号
BEGIN .... END  
  1. 变量赋值【注:使用Set可以直接创建并赋值一个变量,该变量要用@开头】
SET @p_in=1;
SELECT 'Hello World' into @x;
  1. 变量定义【注:DECLARE定义的变量,开头不能加@,也是比较坑】
DECLARE l_int int unsigned default 4000000; 
  1. 存储过程的参数

MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT

CREATEPROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...])
  • IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
  • OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
  • INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
  1. 注释
#注释方式一
-- 注释方式二【注意有空格】
/*
    注释方式三【可以注释多行】
*/

二、进阶

1). 条件语句

  1. if---then---else---end if 语句
delimiter $$
create PROCEDURE proc(aa int)
begin
    declare sum int;
    set sum = 100;
    if aa > 0 then
      set sum = sum - aa;
     else 
      set   sum = sum + aa;
     end if;
     select sum;    
end$$
  1. case---when---then---else---end case语句
delimiter //
CREATE PROCEDURE proc2 ( aa INT ) BEGIN
DECLARE sum INT;
SET sum = 100;
CASE aa 
WHEN 0 THEN
SET sum = sum + 10;
WHEN 1 THEN
SET sum = sum + 11;
ELSE 
SET sum = sum + 12;
END CASE;
SELECT sum;
END //

2). 循环语句

  1. while---do---end while语句
delimiter //
CREATE PROCEDURE proc3(a int)
BEGIN
    set @result = a;
    WHILE a > 0 DO
        set @result = @result + a;
        set a = a - 1;
    END WHILE;
    select @result;
END //

call proc3(100)
  1. repeat---until 结束条件 end repeat;
delimiter //
CREATE PROCEDURE proc4(aa int)
BEGIN
    declare result int;
    set result = 0;
    
    REPEAT
    set result = result + aa;
    set aa = aa - 1;
    UNTIL aa <= 0 END REPEAT;

    SELECT result;
END //

CALL proc4(3)
  1. loop语句
label: LOOP
    statement_list

    IF exit_condition THEN
        LEAVE label; 
    END IF; 
END LOOP label;
delimiter //
CREATE PROCEDURE proc5(aa int)
BEGIN
    declare result int;
    set result = 0;
    
    label: LOOP
    set result = result + aa;
    set aa = aa - 1;

    IF aa <= 0 THEN
        LEAVE label; 
    END IF; 
  END LOOP label;
    
    SELECT result;
END //
  1. iterate迭代【复合】
delimiter //
CREATE PROCEDURE proc6(aa int, out result int)
BEGIN
    set result = 0;
    label: LOOP
     #如果aa是偶数,则跳过
     if aa % 2 = 0 then
     set aa = aa - 1;
     ITERATE label;
     end if;
     
     set result = result + aa;
     set aa = aa - 1;    

    IF aa <= 0 THEN
        LEAVE label; 
    END IF; 
  END LOOP label;
    
    SELECT result;
END //

call proc6(3, @result);
SELECT @result;

猜你喜欢

转载自www.cnblogs.com/iwsx/p/12348957.html