• MySQL-存储过程与触发器


    MySQL 存储过程

    定义:

    一组为了完成特定功能的SQL语句集,存储在数据库中经过

    第一次编译后再次调用不需要再次编译,用户通过指定存储过程

    的名字并给出参数来执行它。

    优点:

    1、增强SQL语言的功能和灵活

    2、标准组件式编程,预编译!

    3、较快的执行速度

    4、减少网络流量

    5、保证数据的安全

    缺点:

    1、可移植性差

    2、统一标准,后期维护大。

    一、定义存储过程

    语法:

    create procedure 过程名(参数1,参数2)

    begin

       SQL语句

    end

    #要先修改mysql结束符号,delimiter  新的符号 可以是%或者//

    delimiter //

    例子:

    delimiter //

    create procedure fun()

    begin

       select * from mysql.user;

    end//

    #调用存储过程

    语法:

    call 过程名(参数1,参数2);

    例子:

    call fun//

    二、存储过程的参数类型

    #mysql定义变量方法

    语法格式:  set  @字段名=值

    例如:

    set @num=1

    1、In ,传入参数

    特点:读取外部变量值,传给存储过程来使用的!

    例子:

    set @num=1

    create procedure fun(in sun int)

    begin

        select sun;   #查询变量

    set sun=2;

    select sun;

    end //

    call fun(@num)

    2、Out 参数  传出参数

    特点:不读取外部变量,在存储过程执行完毕后保留新值

    例子:

    create procedure fun(out sun int)

    begin

        set sun=1;

    select sun;

    end //

    call fun(@abc)  #赋值给变量,把变量变成局部变量!

    select @abc    #查询变量值

    3、参数inout

    特点:读取外部变量,在存储过程执行完后保留新值,传进来,又传出去!

    例子:

    set @ccc=4

    create procedure fun(inout sun int)

    begin

    select sun;

    set sun=3

    end //

    call fun(@ccc)  #传入变量

    select @ccc     #查看变量的变化值

    三、存储内部定义变量

    #存储过程变量使用

    MySQL使用declare 进行变量定义

    变量定义:

    declare var_name datatype

    declare name varchar(200);

    例子:

    create procedure fun()

    begin

       declare var_name int;

       set var_name=2;

       select var_name;

    end //

    call fun;

    #存储过程的注释

    "--" :单行注释

    "/*..*/":一般用于多行注释

    #查看和删除存储过程

    show create procedure 过程名 G  #查看单个

    show  procedure status g; #查看所有存储过程

    drop procedure 过程名;

    四、存储循环语句

    1、while var <0 do --- end while

    create procedure fun()

    begin

       declare i int;

       set i=1;

       while i<3 do

          set i=i+1;

      select i;

    end while;

    end //

    2、LOOP_LABLE:loop ...if i>1 then ...leave LOOP_LABLE end if--- end loop

    use mysql

    create procedure fun()

    begin

      declare i int;

      set i=1;

      LOOP_LABLE:loop

      set i=i+1;

      select i;

      if i >4 then

    leave LOOP_LABLE;

      end if;

      end loop;

    end //

    3、repeat ---until(条件)-- end repeat

    create procedure fun(n1 int)

    begin

    repeat set @x=@x+1; #循环

    insert into t_name values(@x);

    until @x>n1  #达到条件就结束

    end repeat;  #结束循环

    end;;

    call t2(5)

    五、触发器

    触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力

    #触发器作用:

    1.安全性

    2.审计

    3.实现复杂的非标准的数据库相关完整性规则。

    4.实现复杂的数据完整性规则

    5.实时同步地复制表中的数据

    6.自动计算数据值

    #触发器语法:

    语法:

    create  trigger 触发器名称  触发的时机  触发的动作  on 表名 for each row 触发器状态。

    参数说明:

    触发器名称:  自己定义

    触发的时机: before /after  在执行动作之前还是之后

    触发的动作 :指的激发触发程序的语句类型<insert ,update,delete>

    each row:操作第一行我都监控着

    触发器创建语法四要素:

    1.监视地点(table) 

    2.监视事件(insert/update/delete) 

    3.触发时间(after/before) 

    4.触发事件(insert/update/delete)

    例子:

    create table tb(id int,name vachar(10))

    insert into tb(id,name)values(1,"aa")//

    insert into tb(id,name)values(2,"aa")//

    create trigger funn after insert on tb for each row set NEW.id=3

    #注意,触发器不能对同一个张表使用

    1. 非常遗憾,MYSQL中触发器中不能对本表进行 insert ,update ,delete操作,以免递归循环触发

    2. 对于update 只能用set进行操作,insert与delete只能借助第二张表才能实现需要的目的

    #查看和删除触发器

    show create trigger fun G #查看单个触发器

    show create triggers   G #查看所有的触发器

    drop trigger fun #删除触发器

  • 相关阅读:
    Working with Deployment Configurations in CodeDeploy
    ECS 容器实例生命周期
    设置 API Gateway 金丝雀版本部署
    Elastic Beanstalk 滚动环境配置更新
    Kinesis Data Firehose 中的数据保护
    为 API Gateway REST API 资源启用 CORS
    高级 AWS Elastic Beanstalk 环境配置
    Amazon SWF Actors
    AWS CloudFormation 模板结构
    字符编码
  • 原文地址:https://www.cnblogs.com/sunjingjingking/p/9743832.html
Copyright © 2020-2023  润新知