zoukankan      html  css  js  c++  java
  • 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;
    
  • 相关阅读:
    CSS3 颜色渐变、阴影、渐变的阴影
    AxureRP分页签 / Tab选项卡切换功能~
    这是我的第一篇博客!
    天池nlp新人赛_task6
    天池nlp新人赛_task5
    天池nlp新人赛_task4
    天池nlp新人赛_task3.对TF-IDF进一步认识
    天池nlp新人赛_task2:数据预处理改进和一些思路
    天池nlp新人赛_task1
    希尔伯特空间
  • 原文地址:https://www.cnblogs.com/iwsx/p/12348957.html
Copyright © 2011-2022 走看看