一、存储函数
相当于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语句
没有参数,也不能被调用
由设定条件触发自动调用执行