问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

MySQL存储过程的实现及其高级特性的应用

创作时间:
作者:
@小白创作中心

MySQL存储过程的实现及其高级特性的应用

引用
CSDN
1.
https://blog.csdn.net/zhouwensmile/article/details/143624290

MySQL存储过程是数据库管理中的重要工具,它能够帮助开发者实现复杂数据库操作的自动化,提高数据库管理效率。本文详细介绍了MySQL存储过程的各种功能和技术细节,包括变量的定义与赋值、传入与传出参数、条件语句(如if-then-else)、循环语句(如while和repeat)、游标的使用方法、函数的定义与使用以及事件调度器(Event)。同时,还包括了一些高阶特性和综合案例,如使用Python脚本与MySQL存储过程结合进行数据归档和清理。

变量

变量赋值1

DROP PROCEDURE IF EXISTS employees.testc ;
DELIMITER $$  -- 在一个成熟的sql客户端中这些语句都用自己写
$$  -- 自用写好create procedure的主体内容就行
CREATE DEFINER=`root`@`localhost` PROCEDURE `employees`.`testc`()
begin
    declare my_uname varchar(32) default '';  -- 定义一个变量
    set my_uname = 'duohappy';  -- 给变量赋值
    select my_uname;  -- 显示这个变量
end $$
DELIMITER ;

变量赋值2

CREATE DEFINER=`root`@`localhost` PROCEDURE `employees`.`testc`()
begin
    declare my_uname varchar(32) default '';  -- 定义一个变量
    select first_name into my_uname from employees where emp_no = 10001;  -- 给变量赋值
    select my_uname;  -- 显示这个变量
end

变量的作用范围

CREATE DEFINER=`root`@`localhost` PROCEDURE `employees`.`testc`()
begin
    declare emp_cnt int default 0;  -- 全局变量
    declare title_cnt int default 0;
    
    begin
        select count(*) into emp_cnt from employees;
        select count(*) into title_cnt from titles;
        
        select emp_cnt, title_cnt;  -- 可以调用emp_cnt,title_cnt
    end;
    
    begin
        declare max_birth date;
        declare min_birth date;
        select max(birth_date), min(birth_date) into max_birth, min_birth from employees;
        select emp_cnt, title_cnt, max_birth, min_birth;  -- 同样可以调用
    end; 
end

传参

传入参数 in

CREATE PROCEDURE employees.testa(in my_emp_no int)  -- 参数类型是int,用来传入
begin
    declare my_birth date;
    
    select birth_date into my_birth from employees where emp_no = my_emp_no;
    select my_emp_no, my_birth;
END

传出参数 out

CREATE PROCEDURE employees.testa(in my_emp_no int, out my_birth date)  -- 传入,传出参数
begin
    select birth_date into my_birth from employees where emp_no = my_emp_no;
    select my_emp_no, my_birth;  -- 外部定义了变量接收这个传出参数的话,可以不用在内部select
END

在调用的时候,必须定义一个变量,用于接收传出参数的值

命令行操作

set @my_birth := ''; -- 定义一个变量
call testa(10001, @my_birth);  -- 变量用于接收传出参数
select @my_birth;  -- 得到变量的值

传入传出参数 inout

CREATE PROCEDURE employees.testa(inout my_emp_no int, inout my_birth date)  -- 传入传出
begin
    set my_emp_no = 10001;
    set my_birth = 0;
    
    select my_emp_no, birth_date into my_emp_no, my_birth from employees where emp_no = my_emp_no;
END

可以传出传入,那么可以方便的在外部接收变量

命令行操作

set @my_emp_no := 0; -- 定义一个变量
set @my_birth := 0;
call testa(@my_emp_no, @my_birth);
select @my_emp_no, @my_birth;

条件语句

if-then-else-end if

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号