mysql自定义存储过程_MySQL自定义函数、触发器、存储过程

存储过程

概念

存储过程,是一个数据库对象,类似一个函数。

在存储过程中可以使用SQL中的绝大部分内容,并且可以加入编程语言的特性(循环判断分支)。

编写好存储过程之后,可以在客户端调用存储过程,存储过程会自动的执行里面的一系列代码

在存储过程中使用DDL/DML/TCL 和普通SQL一样,DQL和普通SQL略有区别。

创建存储过程

创建存储过程的语法

create PROCEDURE 过程名称([参数列表])

BEGIN

SQL语句

END;

--参数列表的声明规范:参数的输入、输出类型 参数名称 参数的类型;过个参数之间用逗号分隔

--参数的输入/输出类型

1. In类型 外界数据传递给存储过程

2. Out类型 可以把存储过程中的数据返回给外界调用者

3. INOUT类型 既可以传入 又可以传出

创建存储过程

-- 创建一个存储过程,查询EMP表中的数据总数并返回结果

-- 注意:声明过程中需指明参数类型,但是没有参数长度的指定

create PROCEDURE FUNC1(OUT Total INT)

BEGIN

-- 把查询结果赋值给OUT类型的参数 select .. into .. from ..

-- 通过OUT类型参数将结果返回给调用者

select count(1) into Total from emp;

END;

查看创建的存储过程

CREATE DEFINER=`root`@`localhost` PROCEDURE `FUNC1`(OUT Total INT)

BEGIN

-- 把查询结果赋值给OUT类型的参数

-- 通过OUT类型参数将结果返回给调用者

select count(1) into Total from emp;

END;

调用存储过程

-- 调用义好的存储过程,就像调用函数一样

call FUNC1(@Total); -- 调用存储过程,通过@Total给存储过程传递一个OUT类型参数

select @Total; -- 存储过程通过OUT类型参数返回结果,查询OUT类型参数获取存储过程的执行结果

删除存储过程

drop procedure FUNC1;

练习

-- 创建存储过程 返回两个数相加的结果

-- 如果没有指明参数的输入输出类型,默认为IN类型

create procedure func2(num1 INT,num2 int,OUT res int)

begin

-- 把num1+num2的结果赋值给res

set res = num1+num2;

end;

-- 调用存储过程,查询结果,参数名字并不一定与定义的参数名一样

call func2(10,20,@re);

select @re; --30

存储过程缺点

不能移植 无法移植 在不同数据库中,存储过程语法不同

不能移植 一旦使用存储过程 将无法移植

不能移植 除非不考虑移植 才使用存储过程

面试问到就说没用过,因为项目考虑数据移植性

自定义函数

-- 定义一个函数

create function f007(arg1 int, arg2 int)

returns int

Begin

declare result int default 0;

set result = arg1 + arg2;

return(result);

end ;

-------------------------------调用函数--------------

select f007(1,5);

函数与存储过程的区别

函数必须有返回值

函数中不能使用SQL

触发器

当对某张表做DML操作时,可以使用触发器自定义关联行为。

触发器用于在数据库的DML操作之前/之后执行某些操作

触发器trigger的定义语法

-- 在tab1表中创建一个触发器trig1 在每一行数据插入之前/之后 do something

create TRIGGER trig1 before/after insert on tab1 for each row

begin

--do something

end;

NEW关键字 代表新数据 NEW.name获取新数据的name值

OLD关键字 代表老数据

-- 在emp_bak中创建触发器t1,每次往emp_bak插入数据之前

create trigger t1 before insert on emp_bak for each row

begin

-- 执行往emp_bak1表插入相同的数据 NEW代表新数据

insert into emp_bak1(empno,ename)values(NEW.empno,NEW.ename);

end;

-- 测试

insert into emp_bak(empno,ename)values(2234,"张三");

-- 在emp_bak中创建触发器t2,每次update emp_bak数据之后

create trigger t2 after update on emp_bak for each row

begin

-- 在emp_bak1表中执行相同的操作 OLD代表老数据

update emp_bak1 set ename = NEW.ename where ename=OLD.name;

end;

-- 测试

update emp_bak set ename="张三丰" where ename="张三";

不推荐使用视图和触发器

视图 在开发环境怎么折腾都没问题 但是用于生产环境时视图想变动就难了

delimiter

终止符定义,默认是;

delimiter \\将终止符定义为\\

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值