zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    定义 : angular view 和controller 之前的 ng-init 由谁来负责
    pl/sql如何在云端服务器上新建数据库
    oracle连接服务器上数据库
    svn check下来的代码在eclipse中没有run on server
    sql server在修改表结构后不能保存
    用mybatis-generator自动生成代码报“前言中不允许有内容”
    启动Tomact时报failed to start conponent
    spring MVC中controller失效
    maven项目中连接sqlserver和mysql的区别
    DBCP连接池的配置
  • 原文地址:https://www.cnblogs.com/gepuginy/p/10589159.html
Copyright © 2011-2022 走看看