zoukankan      html  css  js  c++  java
  • MySQL——自定义[存储]函数、触发器

    一. 编程基础

    1)        结束符

     

    2)        代码块

    Begin 相当于 {

    end;  相当于 }

    1.    变量

    系统变量

    Show variables; 

    查看系统变量sql_mode

    1 会话变量
    2 Set @变量名=值;

    局部变量 // 在函数或过程内部定义的变量

    1 Declare 变量名 类型 default 默认值;
    2 
    3 Declare  I  int default 0;

    2.    循环while

    1 变量初始化;
    2 
    3 [名称]:While 条件判断 do
    4 
    5 循环体;
    6 
    7 增量;
    8 
    9 End 空格 while;
    delimiter //
    create function mywhile(n int) returns int
        begin
            declare i int default 0;
            declare sum int default 0;
    
            while i <= n do
                set sum = sum + i;
                set i = i +1;
            end while;
            return  sum;
        end;
    //
    delimiter ;

    调用函数:

    1 select mywhile(100);

    3.    判断if

    If 条件 then
    
             return 返回值;
    
    Elseif 条件 then
    
             return 返回值;
    
    Else
    
             return 返回值;
    
    End if;
    delimiter //
    create function checkuser(name varchar(11)) returns varchar(11)
        begin
            if name = 'admin' then
                return "ok";
            else 
                return "no";
            end if;
        end;
    //
    delimiter ;

    二.自定义[存储]函数

    1)        创建自定义函数

    Create  Function 名称(参数 数据类型) returns 数据类型
    
    说明:
    
    create function 关键字
    名称  //自定义函数名称,用来调用.
    ([参数 数据类型])  //形参为可选
    Returns 数据类型 //指明返回值的类型, 注意:returns
    注意:自定义函数体中必须有返回值 使用关键字return
     
    
    没有参数的:

    delimiter //
    create function test() returns varchar(11)
        begin
            return 'ok';
        end;
    //
    delimiter ;

    2)        调用函数

    Select 函数名称([参数]);

    说明: select 函数名称([参数]) // 根据定义函数时形参.  ,形参与实参保持一致.

    3)        查看创建函数信息

    show create function 函数名称 G

    4)        查看所有自定义函数

    1 show function status G

    5)        删除自定义函数

    1 Drop function 函数名称; 

    如果当前数据库不是db_five

    Drop function db_five.mywhile;

    自定义函数中可以执行的SQL语句: delete, update,insert

    三.存储过程

    概念: 存储过程就是一条或多条SQL语句的集合.即没有返回值的存储函数

    delimiter //
    create procedure myselect() 
        begin
             select * from student;
        end;
    //
    delimiter ;

    1.    定义存储过程

    Create procedure 过程名称(in 参数 类型,out 参数 类型 inout 参数 类型)

    说明:

    1)        Create procedure  // 创建过程关键字

    2)        In 参数 数据类型 (默认)  //类似于php中的拷贝传值

    3)        Out 参数 数据类型   //类似于php中的引用传值, 传递到过程中将这个变量赋值为NULL;

    4)        Inout 参数 数据类型  //类似于php中的引用传值;

    delimiter //
    create procedure mytest(in a int, out b int,inout c int) 
        begin
             select a,b,c;
             set a=11,b=22,c=33;
             select a,b,c;
        end;
    //
    delimiter ;

    2.    调用存储过程

    Call 过程名称( [参数])

    3.    查看创建存储过程信息

    Show create procedure 过程名称

    4.    查看所有存储过程

    Show procedure status G 

    5.    删除存储过程

    Drop procedure 过程名称

    四.触发器

    概念: 触发器是由事件来触发某个操作,这些事件包括INSERT、UPDATE和DELETE语句。当执行这些事件时,就会激活触发器执行相应的操作。

    1.    创建触发器

    create trigger 名称 after|before 事件 insert|update|delete  on 表名  for each row

    说明:

    1)        Create trigger //创建触发器的关键字

    2)        名称

    3)        After|before , 触发时机

    4)        insert|update|delete  //事件

    5)        on 表名 //作用于哪张表

    6)        for each row //触发器是基于行. 

    nowtime  //id,nowtime;
    nowuser  //id,name
    
    在用户表中添加用户时,通过触发器会自动在nowtime表中将当前的时间添加
    
    delimiter //
    create trigger tg1 after insert on nowuser for each row
        begin
            insert into nowtime values (null,now());
        end;
    //
    delimiter ;

    2.    两个关键字: new, old

    在触发器中,当触发事件发生时,

    new : 代表新行, old: 代表旧行

    insert 操作: 成功之后,其后会自动产生一行新的数据. 在触发器中通过new获取新行字段值

    delete 操作, 其成功之后, 对旧行数据进行删除,在触发器中可以通过old获取旧行字段值

    update操作: 其会对原有的旧行,更新为新行. 既有新行又有旧行

    insert 事件

    delimiter //
    create trigger tg1 after insert on tb_order for each row
        begin
            update tb_goods  set inv = inv - new.num where  id = new.pid;
        end;
    //
    delimiter ;

    Delete  事件:

    -- delete 
    delimiter //
    create trigger  tg2 after delete on tb_order for each row
        BEGIN    
              update tb_goods set inv = inv + old.num where id = old.pid;
        end;
    //
    delimiter ;

    Update 事件:

    New,old

    delimiter //
    create trigger tg3 after update on tb_order for each row
        begin
            update tb_goods  set inv = inv + old.num - new.num where  id = old.pid;
        end;
    //
    delimiter ;

    3.    显示所有触发器

    Show triggers G

    4.    删除触发器

    Drop trigger 触发器名称
  • 相关阅读:
    排序
    git常用操作_分支合并_新建工程等
    ibatis 中调用存储过程
    IDEA试用期结束激活问题
    kafka本地工程的调用说明
    python yield 和 yield from用法总结
    ubuntu14.06 Lts开启ssh服务
    QT-1-环境搭建QT5.4.1&MinGW4.9.1
    虚拟机Ping不通主机解决
    CRC类(处理ITU表)
  • 原文地址:https://www.cnblogs.com/mrszhou/p/7482573.html
Copyright © 2011-2022 走看看