MYSQL高级第一天(3)


存储过程和函数:

一、定义:

  存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效果是有好处的。

存储过程和函数的区别在于函数必须有返回值,而存储过程没有

函数:是一个有返回值的过程;

过程:是一个没有返回值的函数;

 

二、语法:

1、创建:

delimiter $;
create procedure pro_test1()
begin
    select 'Hello';
end$

2、查看:

--方法一
select name from mysql.proc where db='db_name';

--方法二
show procedure status/G;

--方法三
show create procedure pro_test1/G;

3、调用:

call pro_test1();

4、删除:

drop procedure pro_test1;

 

二、语法结构:

1、变量:

声明:declare

delimiter $;
create procedure pro_test1()
begin
    declare num int default 0;
    select concat('num的值为:',num);
end$

赋值(set 或者 select into):

delimiter $;
create procedure pro_test2()
begin
    declare num int default 0;
    set num=num+10;
    select concat('num的值为:',num);
end$

  

delimiter $;
create procedure pro_test3()
begin
    declare num int default 0;
    select count(*) into num from city;
    select concat('city表中的记录数为:',num);
end$

call pro_test3();

 

三、流程控制:

1、if条件判断:

delimiter $;
create procedure pro_test4()
begin
    declare height int default 175;
    declare description varchar(50) default '';
    if height>=180 then
        set description="高挑";
    elseif heihgt>=170 then
        set description="标准";
    else
        set description="一般";
    select concat('身高为:',height,'对应的身材类型为:',description);
    end if;
end$

@会话变量,@@系统变量

set @name=’itcast’;

select @name;

传参:

mysql>delimiter $;
->create procedure pro_test6(in height int,out description varchar(10))
->begin
->   if height>=180 then
->       set description='高';
->    elseif height>=170 then
->        set description='中';
->    elseif height>=160 then
->        set description='低';
->   end if

mysql>call pro_test6(175,@description)$

mysql>select @descriptioin$

  

2、case语法:

delimiter $;
create procedure pro_test7(mon int)
begin
    declare result varchar(10) default '';
    case
        when mon>=1 and mon<=3 then
            set result='第一季度';
        when mon>=4 and mon<=6 then
            set result='第二季度';
        when mon>=7 and mon<=9 then
            set result='第三季度';
        when mon>=10 and mon<=12 then
            set result='第四季度';
    end case;
    select concat('传递的月份为:',mon,‘,属于’,result);
end$

 

3、while循环:

delimiter $;
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$

 

4、repeat循环

delimiter $;
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$

  

5、loop循环

delimiter $;
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$

 

四、游标、光标:

语法:

delimiter $;
create procedure pro_test11()
begin
    declare e_id int default 0;
    declare e_name varchar(50) default '';
    declare e_age int default 0;
    declare e_salary int default 0;
    declare has_data int default 1;
    
    declare emp_result cursor as select * from emp;
    open emp_result;    

    fetch emp_result int e_id,e_name,e_age,e_salary;
    select concat('id=',e_id,',name=',e_name,',age=',e_age,',salary=',e_salary);
    select concat('id=',e_id,',name=',e_name,',age=',e_age,',salary=',e_salary);
    close emp_result;
end$

  

循环读取游标:

delimiter $;
create procedure pro_test11()
begin
    declare e_id int default 0;
    declare e_name varchar(50) default '';
    declare e_age int default 0;
    declare e_salary int default 0;
    declare has_data int default 1;
    
    declare emp_result cursor as select * from emp;
    declare exit handler for not found set has_data=0;
    open emp_result;
    
    repeat
    fetch emp_result int e_id,e_name,e_age,e_salary;
    select concat('id=',e_id,',name=',e_name,',age=',e_age,',salary=',e_salary);
    until has_data=0
    end repeat;
    close emp_result;
end$

  

 

五、存储函数:

语法:

--创建
delimiter $;
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(1)$

  

--删除
drop function fun1$

  

原创文章,作者:jamestackk,如若转载,请注明出处:https://blog.ytso.com/272559.html

(0)
上一篇 2022年7月9日
下一篇 2022年7月9日

相关推荐

发表回复

登录后才能评论