• MySQL 存储过程和函数02


    MySQL 存储过程
    4)case结构
    方法一:
        case value
    	    when value then sql语句01
    		when value then sql语句02
    		else sql语句03
    	end case
    	
    方法二:
        case
    	    when 条件语句 then sql语句01
    		when 条件语句 then sql语句02
    		else sql语句03
    	end case
    	
    --给定一个月份,然后计算出所在的季度
    
    create procedure pro_test7(in month int)
    begin
        ......
    end;
    ======================================================
    
    create procedure pro_test7(month int)
    begin
      declare result varchar(10);
      case
    	when month>=1 and month<=3 then
    		set result='第一季度';
    	when month>=4 and month<=6 then
    		set result='第二季度';
    	when month>=7 and month<=9 then
    		set result='第三季度';
    	else
    		set result='第四季度';
      end case;  
      select concat('传递的月份为:',month,'计算出的结果为:',result) as content;	
    end;
    
    call pro_test7(5)
    
    
    5)while循环    满足条件继续循环
    
    while 条件语句 do
        --SQL语句
    	
    end while;
    
    --计算从1加到n的值 -- 累加
    create procedure pro_test8(n int)
    begin
      declare total int default 0;
      declare num int default 1;
      while num<=n do
        set total = total + num;
    	set num = num + 1;
      end while;
      select total;
    end;
    
    call pro_test8(5)
    
    drop procedure pro_test8;   //删除存储过程
    
    6)repeat循环
    while 是满足条件才执行循环,repeat是满足条件就退出循环;
    
    repeat
      --SQL语句;
      until --SQL语句     //此处结束无分号 ;
    end repeat;
    
    --计算从1加到n的值------->repeat
    
    create procedure pro_test9(n int)
    begin
      declare total int default 0;
      
      repeat
      
      end repeat;
    
    end;
    ================================================
    
    
    create procedure pro_test9(n int)
    begin
      declare total int default 0; 
      repeat
        set total = total + n ;
    	set n = n-1;
    	until n = 0 
      end repeat;
      select total;
    end;
    
    call pro_test9(10);
    
    7)loop循环  可实现简单的死循环
        退出循环的条件需要使用其他语句定义 如 leave语句
    	
    8)leave语句
    
    --计算从1加到n的值------->loop....leave语句
    
    create procedure pro_test10(n int)
    begin
      declare total int default 0; 
      c:loop                        //loop循环 需要一个别名 c
      
      end loop c;
      select total;
    end;
    
    ====================================================================
    
    create procedure pro_test10(n int)
    begin
      declare total int default 0; 
      c:loop
        set total = total + n;
        set n = n - 1;
    
        if n <= 0 then
          leave c;
        end if;	  
      end loop c;
      
      select total;
    end;
    
    call pro_test10(4);
    
    9)游标|光标
    
    游标是用来存储查询结果集的数据类型 , 在存储过程和函数中可以使用光标对结果集进行循环的处理。光标的使用
    包括光标的声明、OPEN、FETCH 和 CLOSE
    
    cursor---光标 游标
    fetch---请来  拿来 抓取
    
    declare cursor_name cursor for --SQL语句;
    
    open sursor_name;
    fetch sursor_name into var_name(变量名) ......;
    close cursor_name;
    
    
    create table emp(
    id int(11) not null auto_increment ,
    name varchar(50) not null comment '姓名',
    age int(11) comment '年龄',
    salary int(11) comment '薪水',
    primary key(`id`)
    )engine=innodb default charset=utf8 ;
    
    insert into emp(id,name,age,salary) values(null,'金毛狮王',55,3800),(null,'白眉鹰
    王',60,4000),(null,'青翼蝠王',38,2800),(null,'紫衫龙王',42,1800);
    
    ----查询emp表中数据,并逐行获取 进行展示
    create pro_test11()
    begin
      declare emp_result cursor for select * from emp;
      open emp_result;
      fetch emp_result into ......;
      close emp_result;
    end;
    
    ------------------------------------------------------
    create procedure pro_test11()
    begin
      declare e_id int(11);
      declare e_name varchar(50);
      declare e_age int(11);
      declare e_salary int(11);
      declare emp_result cursor for select * from emp;
      
      open emp_result;
      fetch emp_result into e_id,e_name,e_age,e_salary;
      select concat('id=',e_id,'name=',e_name,'age=',e_age,'薪资为:',e_salary);
      
      fetch emp_result into e_id,e_name,e_age,e_salary;
      select concat('id=',e_id,'name=',e_name,'age=',e_age,'薪资为:',e_salary);
      
      fetch emp_result into e_id,e_name,e_age,e_salary;
      select concat('id=',e_id,'name=',e_name,'age=',e_age,'薪资为:',e_salary);
      
      fetch emp_result into e_id,e_name,e_age,e_salary;
      select concat('id=',e_id,'name=',e_name,'age=',e_age,'薪资为:',e_salary);
      
      close emp_result;
    end;
    
    call pro_test11();
    
    drop procedure pro_test11();
    
    --------------------------------------------------------------------------------
    
    create procedure pro_test12()
    begin
      declare e_id int(11);
      declare e_name varchar(50);
      declare e_age int(11);
      declare e_salary int(11);
      declare has_data int default 1;
      
      declare emp_result cursor for select * from emp;
      DECLARE EXIT HANDLER FOR NOT FOUND set has_data=0;     
      
      open emp_result;
      
      repeat
        fetch emp_result into e_id,e_name,e_age,e_salary;
        select concat('id=',e_id, 'name=', e_name, 'age=', e_age,'薪资为', e_salary);
    	until has_data = 0
      end repeat;
      
      close emp_result;
    end;
    
    call pro_test12();
    
    DECLARE EXIT HANDLER FOR NOT FOUND set has_data=0;  //mysql 句柄触发退出机制 必须跟在游标声明下面
    
    until has_data = 0  //此处后面结束符  不允许有分号 ; 
    
    
    10)存储函数   有返回值的过程
    
    create function function_name([参数列表....])
    returns type
    begin
      ......
    end;
    
    ------定义一个存储函数,获取满足条件(city表)的总记录数;
    create function fun1(countryID int)
    RETURNS int
    begin
      ......
    end;
    
    -------------------------------------------------------------
    
    create function fun1(countryID int)
    RETURNS int
    begin
      declare cnum int;
      
      select count(*) into cnum from city where country_id = countryID;
      return cnum;
      
    end;
    
    select fun1(2);
    
    drop function fun1;
    

      

  • 相关阅读:
    KubeCon 2020 演讲集锦|《阿里巴巴云原生技术与实践 13 讲》开放下载
    突围数字化转型,让特步同比增长24.8%的全渠道中台
    阿里云飞天大数据产品价值解读——《一站式高质量搜索开放搜索》
    高德AR驾车导航解决方案
    我在阿里写代码学会的六件事
    送外卖也要“黑科技”?阿里移动感知技术应用揭秘
    阿里云机器学习怎么玩?这本新手入门指南揭秘了!
    用户自定义类型03 零基础入门学习Delphi33
    用户自定义类型03 零基础入门学习Delphi33
    用户自定义类型01 零基础入门学习Delphi31
  • 原文地址:https://www.cnblogs.com/walkersss/p/15125689.html
Copyright © 2020-2023  润新知