Mysql中怎样创建和使用存储过程

1、什么是存储过程

  存储过程,带有逻辑的sql语句

2、存储过程特点

  1)执行效率非常快!存储过程是在数据库的服务器端执行

  2)移植性很差!不同的数据库的存储过程是不能移植的。

3、存储过程语法

  

-- 创建存储过程
DELIMITER $ --声明存储过程的结束符
CREATE PROCEDURE stu_test() --存储过程名称(参数列表)
BEGIN    --开始
    -- 可以写多个sql语句          -- sql语句+流程控制    
END $    --结束 结束符

-- 执行存储过程
call stu_test()   --call 存储过程名称(参数)

参数:
IN:  表示输入参数,可以携带数据带存储过程中
OUT: 表示输出参数,可以从存储过程中返回结果 
INOUT: 表示输入输出参数,两者结合

4、案例

 

-- 存储过程
-- 1、需求:传入一个学生ID,查询该学生的信息
    -- 带有输入参数的存储过程
delimiter $
create PROCEDURE stu_findByid(in sid int)
begin
    select * from student where id=sid;
END $
-- 调用存储过程
call stu_findByid(1);

-- 2、带有输出参数的存储过程
delimiter $
create procedure stu_out(out str varchar(20))
begin
    -- 给参数赋值
    set str='这是一个输出参数';
end $
-- 删除存储过程
drop procedure stu_inout;
-- 调用存储过程
-- 1)定义了一个变量
-- 2)定义了一个会话变量接收存储过程输出的参数
call stu_out(@name);
select @name;
-- 3、输入输出参数的存储过程
delimiter $
create procedure stu_inout(inout n int)
begin
    select n;
    set n=500;
end $
set @n=10;
call stu_inout(@n);
select @n;

-- 4、带条件判断的存储过程
    -- 需求:输入一个正整数,如果1,返回“星期一”,如果2,返回“星期二。。。。其他返回输入错误”
delimiter $
create procedure stu_testIf(in num int,out str varchar(20))
begin
    if num=1 then   -- 开始
        set str='星期一';
    elseif num=2 then
        set str='星期二';
    elseif num=3 then
        set str='星期三';
    else
        set str='输入错误';
    end if;         -- 结束
end $
-- 执行存储过程
call stu_testIf(2,@str);
select @str;

-- 5、带循环功能的存储过程
    -- 输入一个整数,求和。比如输入100,统计1-100的和
delimiter $
create procedure stu_testWhile(in num int,out result int)
begin
        -- 定义两个局部变量
        DECLARE i int default 1;
        declare vsum int default 0;
        while i<=num do
                set vsum = vsum+i;
                set i = i+1;
        end while;
        set result = vsum;
END $
call stu_testWhile(100,@result);
select @result;
drop procedure stu_testWhile;
-- 6、使用查询的结果赋值给变量(into)
delimiter $
create procedure stu_findByid2(in eid int,out vname varchar(20))
begin
    select name into vname from student where id=eid;
end
call stu_findByid2(1,@vname);
select @vname;
-- 7、练习,编写一个存储过程
use students;
select * from user;
    -- 如果学生的英语平均分小于等于70分,刚输出‘一般’
    -- 如果学生的英语平均分大于70,且小于等于90分,刚输出‘良好’
    -- 如果学生的英语平均分大于90分,刚输出‘优秀’
delimiter $
create procedure stu_testAvg(out str varchar(20))
begin
    -- 计算英语平均分
    declare savg double;
    select avg(score) into savg from user;
    if savg<=70 then
        set str='一般';
    elseif savg>70 and savg<=90 then
        set str='良好';
    else 
        set str='优秀';
    end if;
end $
call stu_testAvg(@str);
select @str;
原文地址:https://www.cnblogs.com/gepuginy/p/10589159.html