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 触发器名称

 

posted @ 2017-09-05 23:39  QinXiao.Shou  阅读(1517)  评论(0编辑  收藏  举报