首页 > 技术文章 > mysql 编程

gaogzhen 2018-11-27 10:46 原文

一、存储函数

  相当于php或者js中有返回值的函数 --完成一定“计算”后返回单个的数据值

  • 定义:

    create function 函数名(parameter p1 value_type, parameter p2 value_type, ...)

    returns value_type

    begin

      [statement_list]

      return value;

    end

    • value_type 数据类型 必须有返回语句 return 且返回值类型和设定的类型一致
  • 调用形式::跟系统函数调用一样,直接使用名字,定义有参数则必须给定实参
  • 实例:求 n的阶乘
    create function factorial_gao(num int)
    returns int
    begin
    	declare n int default 1;
    	declare fac int default 1;
    	while n <=num do
    	set fac = fac*n;
    	set n = n+1;
    	end while;
    	return fac;
    end;
    

   默认以;为语句结束符,需要delimiter 结束符 来更改,确保存储函数以“一条语句”执行

  • 删除:drop function [if exists] 存储函数名;

二、存储过程

  相当于php或者js中没有返回值的函数 --它只“做事”(包含增删改查),不返回单个数据

  • 定义

    create procedure 存储过程名([in|out|inout] p1 value_type, [in|out|inout]  p2 value_type,...)

    begin

    [statement_list]

    #其中查询语句会作为存储过程调用的结果,跟执行select语句一样,返回结果集

    end

  • 调用:call 存储过程名(形参 1, 形参 2);
  • 删除:drop procedure [if exists] 存储过程名;
  • 示例:向表saving(存款)中添加新数据
    create procedure insertRec(acc varchar(20), des float)
    begin
        insert into saving(account, deposit) values(acc, des);
    end;

    添加之前:

   添加之后:

三、触发器

  就是数据库中预先设定好的用于某个表上发生某个时间(增/删/改)的时候(前/后)来完成某些任务的一种代码机制。

  • 定义

    create trigger trigger_name before|after insert|update|delete on table_name for each row

    begin

      #要执行的代码

      #不能使用select 语句

      #不能返回数据

    end

    • before|after insert|update|delete  组合有6种形式,既每个表可以设定触发器有6种
  • 删除::drop trigger [if exists] trigger_name;
  • 实例:表test新添加的数据,只讲前2个字段title,content 显示给客户看

     讲给客户看的定义为字表:test_sub

     表test:

     表test_sub:

     定义触发器:

create trigger createSub after insert on test for each row
begin
    set @t1 = new.title;
    set @c1 = new.content;
    insert into test_sub(title, content) values (@t1, @c1);
end;

     表test添加新数据:

mysql> insert into test(title,content, num)values('sixth', 'this is the sixth data.', 525.20)$
Query OK, 1 row affected (0.01 sec)

    添加新数据后

      表test:

      字表test_sub:

四、总结

  共同点

    使用普通变量

    使用流程控制

    都是一段“代码”

  存储函数

    必须返回一个数据

    不能有select语句

    调用结果可以作为一个“数据”使用,用于select语句或者数据操作语句中

  存储过程

    没有返回值

    可以使用select语句

    形参 可以设置数据流向in out  inout

    调用:call procedure_name(形参 1 数据类型,...)

  触发器

    没有返回值

    不能使用select语句

    没有参数,也不能被调用

    由设定条件触发自动调用执行

  

推荐阅读