存储过程

关于存储过成
1.概要
  • 存储过程是一组预定义的SQL语句集合
  • 这些语句被存储在数据库服务器中,并可以像调用函数一样被多次调用。
  • 存储过程通常由一系列SQL语句、条件逻辑、循环和异常处理组成。
2.创建和调用的基本过程
  • 创建存储过程。

    #delimiter用于更改语句分隔符(默认状态下为;)
    delimiter $ # 更改分隔符为$
    create procedure fun_name()
    begin
    	sql 语句
    end $
    delimiter;  # 将分隔符恢复为默认的分号
    
  • 确定存储过程参数。

    • 存储过程可以接受输入参数和输出参数。
    • 存储过程可以接受输入参数和输出参数。
  • 调用存储过程。

    # 使用CALL语句,后跟存储过程的名称和参数(如果有)
    call fun_name();
    
    #调用带有参数的存储过程
    call fun_name(@x); # 符号将参数声明为一个用户变量。
    select @x;
    
基本使用
0.使用 northwind 示例数据库
1.创建和调用存储过程
  • 创建存储过程 all_data,查看 employees 表的所有数据

    delimiter $
    create procedure all_data()
    begin
    	select * from employees;
    end $
    delimiter ;
    
    call all_data();
    
  • 创建存储过程 max_salary,查看 employees 表的最高工资

    delimiter $
    create procedure max_salary
    begin
    	select max(salary) as max_salary
    	from employees;
    end $
    delimiter ;
    
    call max_salary;
    
  • 创建存储过程 min_salary,查看 employees 表的最低工资并将最低工资通过参数 minSalary 输出

    delimiter $
    create procedure min_salary (out minSalary double)
    # 参数作为输出(出口参数)
    begin
    	select min(salary) into minSalary
    	from employees;
    end $
    delimiter ;
    
    call min_salary(@minSalary);
    select @minSalary;
    
  • 创建存储过程 get_salary_by_id,查看 employees 表某员工编号员工的工资,并用 emp_id 输入员工编号

    delimiter $
    create procedure get_salary_by_id(in emp_id int)
    #参数作为输入(入口参数)
    begin
    	select salary from employees
    	where employee_id = emp_id;
    end $
    delimiter ;
    
    call get_salary_by_id(103);
    
  • 创建存储过程 get_salary_by_name,查看 employees 表的某员工的工资,入口参数 emp_name 员工名字,出口参数 salary 该员工的工资

    delimiter $
    create procedure get_salary_by_name(in name varchar(20), out s double(8, 2))
    begin
    	select salary into s
    	from employees
    	where first_name = name;
    end $
    delimiter ;
    
    set @name = 'Lex';
    call get_salary_by_name(@name, @salary);
    select @salary;
    
  • 创建存储过程 get_mgr_name,查询 employees 表中某员工名字的领导的名字参数 name 同时作为输入的员工名字和输出的领导名字

    delimiter $
    create procedure get_mgr_name(inout name varchar(20))
    begin
      select first_name into name
      from employees
      where employee_id = (
        select manager_id
        from employees
        where first_name = name
      );
    end $
    delimiter ;
    
    set @name = 'Lex';
    call get_mgr_name(@name);
    select @name;
    
2.创建存储函数
  • 创建存储函数 get_mgr_name,查询 employees 表中某员工名字的领导的名字

    delimiter $
    create function doget_mgr_name(name varchar(20))
    returns varchar(20)
    begin
      return(
        select first_name
        from employees
        where employee_id = (
          select manager_id
          from employees
          where first_name = name
        )
      );
    end $
    delimiter ;
    
    select doget_mgr_name('Lex');
    
  • 创建存储函数 get_count_by_dept_id,查询 employees 表某部门编号的部门员工人数

    delimiter $
    create function get_count_by_dept_id(dept_id int)
    returns int
    begin
      return (select count(*) 
              from employees where department_id = dept_id
             );
    end $
    delimiter ;
    
    set @dept_id = 50;
    select get_count_by_dept_id(@dept_id);
    
3.查看存储过程和存储函数
  • 查看创建代码

    show create procedure xxx;
    show create function xxx;
    
  • 查看状态

    show procedure status where Name = 'all_data';
    show function status where Name = 'avg_salary';
    
  • 查看对象信息

    select * from information_schema.routines
    where routine_name = 'avg_salary';
    
4.删除存储过程和存储函数
  • 使用drop关键字。

  • 示例

    drop function if exists avg_salary;
    drop procedure if exists get_mgr_name;
    

嗨,我的朋友,必须坚强,尽管充满艰难困苦和荆棘。 —— 海龟先生《微笑》

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值