加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_常德站长网 (https://www.0736zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MYSQL 存储过程 触发器

发布时间:2022-09-12 17:22:01 所属栏目:MySql教程 来源:
导读:  存储过程

  mysq5.0版本开始支持存储过程,存储过程是为了完成特定功能的sql语句集mysql触发器,用户可以通过指定存储过程的名字并给定参数(需要时)来执行,类似于在数据库中存放了一个函数。

  

  存储过程
 
  mysq5.0版本开始支持存储过程,存储过程是为了完成特定功能的sql语句集mysql触发器,用户可以通过指定存储过程的名字并给定参数(需要时)来执行,类似于在数据库中存放了一个函数。
 
  创建简单的存储过程
 
  delimiter $ //生命结束符
  create procedure pro_list()
  BEGIN  //存储过程开始
  select * from stu_like; //存储过程语句,可以写多个
  end $  //存储过程结束
  call pro_list(); //调用存储过程
  删除存储过程
 
  drop PROCEDURE if EXISTS pro_list(存储过程名);
  查找存储过程
 
  select * from mysql.proc where db = '数据库名' and `type` = 'PROCEDURE' //查询指定数据库中所有的存储过程
  SELECT * FROM information_schema.routines WHERE routine_schema='数据库名'; //同上,不过是从information_schema数据库中的ROUTINES表中查找的
  SHOW PROCEDURE STATUS WHERE db='数据库名';  //同上,这个好理解一些,都是查找指定数据库中的全部存储过程
  显示指定存储过程的详细信息
 
  SHOW CREATE PROCEDURE 数据库.存储过程名;
  eg:show create procedure pyg.pro_list;  //显示创建pyg库下名为pro_list存储过程的详细信息
  带有参数的存储过程
 
  - in:表示输入参数,存储过程内部可以对参数的值进行修改,但存储过程中修改的参数值不做改变,也就是in参数在存储过程中值可用,但是不能被修改
 
  - out:表示输出参数,out参数在存储过程内部为null,存储过程结束后参数的变化会被保存,也就是说在存储过程中out参数的值不可用,但是可以被修改
 
  - inout:表示输入输出参数,既可以输出参数,又可以输出参数,也就是存储过程内部可以对参数的值进行修改,并将最终值返回给调用者。
 
  delimiter $
          create PROCEDURE pro_in (in id int)
          begin
          set id = id+1;  //id加1
          select id;  //id为2,在存储过程中参数可见
  end $
  set @id = 1;
  call pro_in(@id);
  select @id; //id仍为1,妹有被改变
  delimiter $
    create procedure pro_out(out sid int)  //out输出参数
    begin
    if(sid is not null)
       then sid = sid+1;   //存储过程中的out参数为null,无论调用者是否传值给存储过程,
    select sid;       //输出sid,null
  end $
  set @id = 5; //设置一个会话变量id=5
  call pro_out(@id);
  select @id  //null,值被设置为null
  DELIMITER $
    CREATE PROCEDURE pro_testInOut(INOUT n INT)  -- INOUT: 输入输出参数
    BEGIN
       SELECT n; //10, 查看inout变量
       SET n = n+100;  
  END $
     
    -- 调用
    SET @n=10;
     
    CALL pro_testInOut(@n);
     
    SELECT @n; //110 inout变量值已经被修改了
  触发器
 
  触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,例如当对一个表进行操作( insert,delete, update)时就会激活它执行。
 
  触发器的特性:
 
  1、有begin end体,begin end;之间的语句可以写的简单或者复杂
 
  2、什么条件会触发:I(增)、D(删)、U(改)
 
  3、什么时候触发:在增删改前或者后
 
  4、触发频率:针对每一行执行
 
  5、触发器定义在表上,附着在表上。
 
  创建触发器的基本语法
 
  一个基本的触发器
 
  delimiter $   //定界符
  create TRIGGER _tri BEFORE update on user for each row  //在user表每次进行update操作之前调用
  BEGIN
      set @name = 111;  //每次调用将name变量的值置为111
  end $  //触发器结束
  删除触发器
 
  drop trigger XXX(触发器名)
  查看所有触发器
 
  show triggers;
  查看触发器的详细信息
 
  show create TRIGGER XXX(触发器名);
  触发器中的过度变量OLD和NEW
 
  使用方法: NEW.columnName (columnName 为相应数据表某一列名)
 
  另外,OLD 是只读的,而 NEW 则可以在触发器中使用 SET 赋值,这样不会再次触发触发器,造成循环调用。
 
  delimiter $
  create TRIGGER _tri BEFORE update on user for each row
  BEGIN
  //old是只读的,而new是可以设置的
  set new.id = old.id+1;   //当执行update操作时,将更新之前数据的id加1作为update之后数据的id
  end $
  注:mysql中触发器中不可操作自身表
 
  下面操作有误,不能user的触发器不能在触发器中操作user表本身,防止循环调用
 
  delimiter $
  create TRIGGER _tri BEFORE update on user for each row
  BEGIN
  update user set id=id+1 where id=1;  //将自身user表id字段为1的数据id加1
  end $
 

(编辑:应用网_常德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!