Mysql存储过程、触发器、事件调度器使用入门指南

目录
  • 一、存储过程的简单使用
  • 二、存储过程中的变量
  • 三、变量的作用域
  • 四、存储过程参数
  • 五、逻辑控制语句
    • 1、条件语句
    • 2、循环语句
    • 3、case分支
  • 六、游标
  • 七、自定义函数
  • 八、触发器
  • 九、事件

存储过程(Stored Procedure)是一种在数据库中存储复杂程序的数据库对象。为了完成特定功能的SQL语句集,经过编译创建并保存在数据库中。

一、存储过程的简单使用

创建存储过程

create procedure test()
begin
    select * from users;
end;

调用存储过程

call test();   

二、存储过程中的变量

create procedure test()
begin

  -- 使用 declare语句声明一个变量
  declare username varchar(32) default '';

  -- 使用set语句给变量赋值
  set username='xiaoxiao';

  -- 将users表中id=1的名称赋值给变量username
  select name into username from users where id=1;

  -- 返回变量
  select username;
end;

注意:

  • 变量可以通过set来赋值,也可以通过select into的方式赋值;
  • 变量需要返回,可以使用select语句,如:select 变量名。

三、变量的作用域

存储过程的作用域在begin和end块之间,变量声明在begin之外,可以作为全局变量使用:

 create procedure test()
    begin
      declare userscount int default 0; -- 用户表中的数量
      begin
            select count(*) into userscount from users;
            select userscount; -- 返回用户表中的数量
      end;
      begin
        declare maxmoney int default 0; -- 最大金额
        select max(money) into maxmoney from orders;
        select userscount,maxmoney; -- 返回用户表中的数量、最大金额
       end;
    end;

四、存储过程参数

create procedure 名称([IN|OUT|INOUT] 参数名 参数数据类型 )
begin
......
end

IN: 传入参数(不指定时,默认就是IN类型)

 create procedure test(userId int)
    begin
        declare username varchar(32) default '';
        select name into username from users where id=userId;
        select username;
    end;

OUT:传出参数

create procedure test(in userId int,out username varchar(32))
   begin
     select name into username from users where id=userId;
   end;

INOUT: 既是传入又是传出参数

create procedure test6(inout userId int,inout username varchar(32))
begin
    set userId=2;
    set username='';
    select id,name into userId,username from users where id=userId;
end;

五、逻辑控制语句

1、条件语句

if() then...
elseif() then...
else ...
end if;
create procedure test(in userid int)
begin
   declare my_status int default 0;
   select status into my_status from users where id=userid;

   if(my_status=1)
   then
       update users set score=score+10 where id=userid;
   elseif(my_status=2)
   then
       update users set score=score+20 where id=userid;
   else
       update users set score=score+30 where id=userid;
   end if;
end;

2、循环语句

(1)while

while(表达式) do
   ......
end while;
create procedure test()
begin
  declare i int default 0;
  while(i<10) do
     begin
        select i;
        set i=i+1;
        insert into test1(id) values(i);
     end;
  end while;
end;

(2)repeat

repeat...until...end repeat;

只有当until为真是才跳出循环:

create procedure test()
begin
    declare i int default 0;
    repeat
     begin
        select i;
        set i=i+1;
        insert into test1(id) values(i);
     end;
    until i>=10 -- 如果i>=10,则跳出循环
    end repeat;
end;

3、case分支

case ...
when ... then....
when.... then....
else ...
end case;
 create procedure testcate(userid int)
    begin
        declare my_status int default 0;
        select status into my_status from users where id=userid;

        case my_status
            when 1 then update users set score=10 where id=userid;
            when 2 then update users set score=20 where id=userid;
            when 3 then update users set score=30 where id=userid;
            else update users set score=40 where id=userid;
        end case;
    end;

六、游标

游标保存了查询结果的临时区域

declare 变量名 cursor ... -- 创建一个游标变量
close 变量名; -- 关闭游标
create procedure test()
    begin
        declare stopflag int default 0;
        declare username VARCHAR(32);
        declare username_cur cursor for select name from users where id%2=0;
        -- 游标变量username_cur保存了查询的临时结果,即结果集
        -- 在游标变量中数据的结尾,将变量stopflag设置为1,用于循环中判断是否结束
        declare continue handler for not found set stopflag=1;

        open username_cur; -- 打卡游标
        fetch username_cur into username; -- 游标向前走一步,取出一条记录放到变量username中
        while(stopflag=0) do -- 如果游标还没有结尾,就继续
            begin
                -- 在用户名前门拼接 '_cur' 字符串
                update users set name=CONCAT(username,'_cur') where name=username;
                fetch username_cur into username;-- 游标向前走一步,取出一条记录放到变量username中
            end;
        end while; -- 结束循环
        close username_cur; -- 关闭游标
    end;

七、自定义函数

-- 创建函数
create function 函数名(参数) returns 返回类型;
-- 函数体
begin ...... end;
-- 指定函数的返回值
returns
--函数调用
select 函数名()。
create function getusername(userid int) returns varchar(32)
    reads sql data  -- 从数据库中读取数据,但不修改数据
    begin
        declare username varchar(32) default '';
        select name into username from users where id=userid;
        return username;
    end;

八、触发器

触发器也是一种数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。

创建触发器create trigger 触发器名
after、before:在对表操作之前(before)或者之后(after)触发动作。
操作事件:insert,update,delete等修改操作
影响的范围:for each row

1、需求:出于审计目的,当有人往表users插入一条记录时,把插入的userid,username,插入动作和操作时间记录下来。

create trigger tr_users_insert after insert on users
    for each row
    begin
        insert into oplog(userid,username,action,optime)
        values(NEW.userid,NEW.name,'insert',now());
    end;

2、需求:出于审计目的,当删除users表时,记录删除前该记录的主要字段值

create trigger tr_users_delete before delete on users
    for each row
    begin
        insert into oplog(userid,username,action,optime)
        values(OLD.id,OLD.name,'delete',now());
    end;

九、事件

触发器只是针对某个表产生的事件执行一些语句,而事件调度器则是在某一个(间隔)时间执行一些语句。

在使用这个功能之前必须确保事件调度器event_scheduler已开启:

SET GLOBAL event_scheduler = 1;
-- 或者
SET GLOBAL event_scheduler = on;

--查看开启情况
show variables like '%event_scheduler%';
create event[IF NOT EXISTS]event_name -- 创建使用create event
    ON SCHEDULE schedule -- on schedule 什么时候来执行
    [ON COMPLETION [NOT] PRESERVE] -- 调度计划执行完成后是否还保留
    [ENABLE | DISABLE] -- 是否开启事件,默认开启
    [COMMENT 'comment'] -- 事件的注释
    DO sql_statement; -- 这个调度计划要做什么?

需求:设计一个福彩的开奖过程,每3分钟开奖一次

-- 存储过程
create procedure test()
        begin
            insert into lottery(num1,num2,num3,ctime)
            select FLOOR(rand()*9)+1,FLOOR(rand()*9)+1,FLOOR(rand()*9)+1,now();
        end;
-- 事件
create event if not exists test_event -- 创建一个事件
        on schedule every  3 minute -- on schedule 每三分钟执行一次
        on completion preserve
        do call test;  --调用存储过程

参考文章:mysql存储过程学习笔记

到此这篇关于Mysql存储过程、触发器、事件调度器使用入门的文章就介绍到这了,更多相关Mysql存储过程、触发器、事件调度器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySql视图触发器存储过程详解

    视图: 一个临时表被反复使用的时候,对这个临时表起一个别名,方便以后使用,就可以创建一个视图,别名就是视图的名称.视图只是一个虚拟的表,其中的数据是动态的从物理表中读出来的,所以物理表的变更回改变视图. 创建: create view v1 as SQL 例如:create view v1 as select * from student where sid<10 创建后如果使用mysql终端可以看到一个叫v1的表,如果用navicate可以在视图中看到生成了一个v1的视图 再次使用时,可以直接

  • MySQL的事件调度器使用介绍

    自MySQL5.1.0起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务,可以看作基于时间的触发器. 一.开启 事件调度默认是关闭的,开启可执行 复制代码 代码如下: SET GLOBAL event_scheduler=1; SET GLOBAL event_scheduler=ON; 或者在my.ini文件中加上event_scheduler=1 或者在启动命令后加上"-event_scheduler=1" 可以通过如下命令查

  • MySQL系列之五 视图、存储函数、存储过程、触发器

    目录 一.视图 1.视图的创建 2.查看视图定义 3.删除视图 二.存储函数 1.系统函数 2.自定义函数(user-defined function:UDF) 三.存储过程 四.触发器 总结 一.视图 视图:VIEW,虚表,保存有实表的查询结果,实际数据不保存在磁盘 物化视图:实际数据在磁盘中有保存,加快访问,MySQL不支持物化视图 基表:视图依赖的表 视图中的数据事实上存储于"基表"中,因此,其修改操作也会针对基表实现.其修改操作受基表限制. 注意:修改视图时是修改的原表 1.视

  • 基于mysql事务、视图、存储过程、触发器的应用分析

    一 ,mysql事务 MYSQL中只有INNODB类型的数据表才能支持事务处理. 启动事务有两种方法 (1) 用begin,rollback,commit来实现 复制代码 代码如下: begin 开始一个事务rollback   事务回滚commit    事务确认 (2)直接用set来改变mysql的自动提交模式 复制代码 代码如下: set autocommit=0 禁止自动提交set autocommit=1 开启自动提交 demo 复制代码 代码如下: header("Content-t

  • MySQL存储过程中的基本函数和触发器的相关学习教程

    MySQL存储过程的常用函数 一.字符串类 CHARSET(str) //返回字串字符集 CONCAT (string2 [,... ]) //连接字串 INSTR (string ,substring ) //返回substring首次在string中出现的位置,不存在返回0 LCASE (string2 ) //转换成小写 LEFT (string2 ,length ) //从string2中的左边起取length个字符 LENGTH (string ) //string长度 LOAD_FI

  • 带你了解MySQL中的事件调度器EVENT

    MySQL中的事件调度器,EVENT,也叫定时任务,类似于Unix crontab或Windows任务调度程序. EVENT由其名称和所在的schema唯一标识. EVENT根据计划执行特定操作.操作由SQL语句组成,语句可以是BEGIN-END语句块.EVENT可以是一次性的,也可以是重复性的.一次性EVENT只执行一次,周期性EVENT以固定的间隔重复其操作,并且可以为周期性EVENT指定开始日期和时间.结束日期和时间.(默认情况下,定期EVENT在创建后立即开始,并无限期地继续,直到它被禁

  • Mysql存储过程、触发器、事件调度器使用入门指南

    目录 一.存储过程的简单使用 二.存储过程中的变量 三.变量的作用域 四.存储过程参数 五.逻辑控制语句 1.条件语句 2.循环语句 3.case分支 六.游标 七.自定义函数 八.触发器 九.事件 存储过程(Stored Procedure)是一种在数据库中存储复杂程序的数据库对象.为了完成特定功能的SQL语句集,经过编译创建并保存在数据库中. 一.存储过程的简单使用 创建存储过程 create procedure test() begin select * from users; end;

  • MySQL Event Scheduler(事件调度器)

    一.概述 事件调度器是在 MySQL 5.1 中新增的另一个特色功能,可以作为定时任务调度器,取代部分原先只能用操作系统任务调度器才能完成的定时功>能.例如,Linux 中的 crontabe 只能精确到每分钟执行一次,而 MySQL 的事件调度器则可以实现每秒钟执行一个任务,这在一些对实时性要>求较高的环境下就非常实用了. 事件调度器是定时触发执行的,在这个角度上也可以称作是"临时的触发器".触发器只是针对某个表产生的事件执行一些语句,而事件调度器则是在某一个(间隔)时间

  • MySQL计划任务(事件调度器) Event Scheduler介绍

    要查看当前是否已开启事件调度器,可执行如下SQL: SHOW VARIABLES LIKE 'event_scheduler';或 SELECT @@event_scheduler;或 SHOW PROCESSLIST;若显示: +-----------------+-------+| Variable_name   | Value |+-----------------+-------+| event_scheduler | OFF   |+-----------------+-------+

  • 老生常谈mysql event事件调度器(必看篇)

    概述 MySQL也有自己的事件调度器,简单地可以理解为linux的crontab job,不过对于SQL应用来说,它的功能更齐全,也更易于维护.个人感觉如果数量创建太多的话,也可能影响DB性能,且不易调试. MySQL事件调度器的主要内容 总开关 参数event_scheduler为事件调度器的总开关,一般来说设置为ON或者OFF就好,不建议设置成disabled,如果设置为ON,show processlist可看到该线程 创建,修改,查看等语法 关于如何创建,修改event这里不做叙述,创建

  • 使用mysql事件调度器定时删除binlog

    MySQL的事件调度器可以精确到每秒钟执行一个任务,对于一些对数据实时性要求比较高的应用(例如:股票.赔率.比分等)就非常适合.先查看是否启动这个功能: 复制代码 代码如下: SELECT @@event_scheduler; 在使用这个功能之前必须确保 event_scheduler已开启,可执行: 复制代码 代码如下: SET GLOBAL event_scheduler = 1; 或我们可以在配置my.cnf文件 中加上event_scheduler = 1然后来对 binlog 的删除写

  • 详解MySQL用事件调度器Event Scheduler创建定时任务

    前言 事件调度器相当于操作系统中的定时任务(如:Linux中的cron.Window中的计划任务),但MySql的事件调度器可以精确到秒,对于一些实时性要求较高的数据处理非常有用. 1. 创建/修改事件(EVENT) 在MySql中,创建一个新的调度器使用CREATE EVENT,其语法规则如下: CREATE [DEFINER = { user | CURRENT_USER }] EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule [ON

  • python 包中的sched 事件调度器的操作方法

    目录 一.延迟运行事件 二.重叠事件 三.事件优先级 四.取消事件 五.其他方法 一.延迟运行事件 在一个延迟或规定时间之后执行事件,需要采用enter()方法,参数如下: 间隔时间 ( 具体值决定与delayfunc,这里为秒 ) 优先级 ( 两个事件在同一时间到达时,先执行哪一个 ) 调用的函数 函数参数 import sched import time # 生成调度器 scheduler = sched.scheduler(time.time, time.sleep) def print_

  • MySQL中的事件调度基础学习教程

    经常需要有一些定时任务在MySQL表上执行,例如统计.迁移.删除无用数据等.之前的作法是利用Linux cron定时运行脚本,但是发现这样的额外依赖有时并不方便,例如单机多实例部署时,就需要分别手动分别配置不同的cron任务,需要额外配置相应的用户和权限:新环境部署时容易遗漏cron任务等. MySQL提供了Event Scheduler,与Linux下的crontab类似,可以根据时间调度来运行任务,运行一次或多次. 完整的Event Schduler创建语句如下: CREATE [DEFIN

随机推荐