2.存储过程

存储过程和函数:类似于java中的方法
好处:
    1 提高代码的重用性
    2 简化操作

存储过程:一组雨欣编译好的sql语句集合,理解成批处理语句
    1 提高代码的重用性
    2 简化操作
    3 减少编译次数并且减少了和数据库服务器的连接次数,提高效率
    

语法:
    1.创建语法 
        CREATE PROCEDURE 存储过程名(参数列表)
        BEGIN
            存储过程体(一组合法的sql语句)
        END
        注意:
            1.参数列表包含三部分
                参数模式  参数名称  参数类型
            举例:
                IN   stuname VARCHAR(20)
            参数模式:
                1.IN:该参数可以作为输入,也就是说改参数需要
                2.OUT:该参数可以作为输入,也就是该参数可以作为返回值
                3.INOUT:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值
            
            2.如果存储过程体仅仅只有一句话,BEGIN END可以省略
            3.存储过程体中的每条sql语句结尾必须加分号;
            4.存储过程的结尾可以使用DELIMITER重新设置
                语法:
                    DELIMITER 结束标记
                    DELIMITER $
    2.调用语法:
        CALL 存储过程名(实参列表);
        
        
样例:
    1.无参构造方法
        CREATE PROCEDURE myp1()
        BEGIN
        	INSERT INTO `user` (name,age)
        	VALUES ('吴孟达',18),('刘丹',20),('吴振',21);
        END;
        调用:
        call myp1();

    2.创建带in模式的存储过程 
        2.1 单个参数:
            案例1:按照传入名称的不同,实现根据人名查询信息
            声明:
                CREATE myp2(IN user_nmae VARCHAR(20))
                BEGIN
                	SELECT * from `user` WHERE `name`=user_nmae;
                END
            调用:
                call myp2('吴孟达');
        此时有个问题,如果传入参数和表的列名相同怎么办??      

多个参数的存储过程:
    场景:按照姓名和年龄在用户表中找,如果找到,返回成功,找不到,返回失败!
    CREATE  `myp3`(IN name VARCHAR(20),IN age INT)
    BEGIN
        #定义局部变量,默认值是0
        	DECLARE result INT DEFAULT 0;
        	#给局部变量赋值
        	SELECT COUNT(1) INTO result
        	FROM `user`
        	WHERE user.name=name 
        	and user.age=age;
    	#使用局部变量,if函数的使用,后面会详细讲
    	SELECT IF(result>0,'成功','失败');
    END

创建带OUT模式的存储过程

1.单个的out模式返回值
场景:根据传入的id值,获取用户名称
    声明:传入out模式的参数
    CREATE PROCEDURE myp4(IN id int,OUT name VARCHAR(20))
    BEGIN
        #使用查询into的形式进行赋值
        	select `user`.name into name
        	from user  
        	where `user`.id=id;
    END

    调用:
    1.不声明用户变量
        CALL myp4(1,@user_name);
        select @user_name;
    2.声明用户变量
        #声明一个用户变量(作用域在当前会话都有效,必须有值,没值会报错)
        set @u_name='';
        #调用传入
        call myp4(1,@u_name);
        #查询
        select @u_name;
        
2.多个out模式的返回值
    场景:传入id,获取用户和名称
    声明:
    CREATE PROCEDURE myp5(in id int,out name varchar(20),out age int)
    begin 
        #注意,给两个out模式的返回值赋值,使用into作为分界,第一个和第一个对应...
    	select u.name,u.age into name,age 
      from user u 
    	where u.id=id;
    end

    调用:
    call myp5(1,@name,@age);
    select @name,@age;

创建带INOUT模式参数的存储过程

场景,定义两个变量,变量翻倍并返回
创建:
    create procedure myp6(inout a int,inout b int)
    begin 
    	set a=a*2;
    	set b=b*2;
    end 
调用:
    传入的必须是变量,所以定义用户变量并赋值    
     set @a=2;
    set @b=3;
    call myp6(@a,@b);
    select @a,@b;
返回:
    @a        @b
    4         6

存储过程的删除

DROP procedure 存储过程名;
每次只能删除一个

查看储存过程的信息

1.查看表的信息:
    desc 表名;
2.查看视图信息:
    desc 视图名;
3.查看存储过程的信息:
    

posted @ 2022-05-25 20:42  努力的达子  阅读(147)  评论(0编辑  收藏  举报