【Mysql基础】六.存储过程与函数

一.存储过程(Stored Procedure)

1.1理解

	含义:一组经过预先编译的sql语句的封装

优点:①简化操作,提高sql重用性
②减少操作过程中的失误,提高效率
③减少网络传输量
④减少了sql语句暴露在网上的风险,提高数据查询的安全性

和视图,函数的对比:
1.视图是虚拟表,通常不对底层数据直接操作。存储过程是程序化的sql,可
以直接操作底层数据表
2.函数有返回值,存储过程没有返回值

1.2分类

	1.没有参数(无参无返回)
	2.只带IN类型(有参无返回)
	3.只带OUT类型(无参有返回)
	4.IN和OUT类型(有参有返回)
	5.带INOUT类型(有参有返回)

2.1语法:

CREATE PROCEDURE 存储过程名(IN | OUT | INOUT 参数名 参数类型,…)
BEGIN
存储过程体
END

2.2创建存储过程

类型1:无参
案例1:创建存储过程select_all_data(),查看employees表的所有数据

DELIMITER $
	CREATE PROCEDURE select_all_data()
	BEGIN
		SELECT * FROM employees;
	END $
	DELIMITER ;

2.3存储过程的调用(call)

CALL select_all_data();

案例2:创建存储过程avg_employee_salary(),返回所有员工的平均工资

DELIMITER $
	CREATE PROCEDURE avg_employee_salary()
	BEGIN
		SELECT AVG(salary) FROM employees;
	END $
	DELIMITER ;

类型2:带OUT类型
案例3:创建存储过程show_min_salary(),查看employees表的最低薪资值,并将最低薪资通过OUT参数"ms"输出

DELIMITER $
	CREATE PROCEDURE show_min_salary(OUT ms DOUBLE)
	BEGIN
		SELECT MIN(salary) INTO ms
		FROM emplouees;
	END $
	DELIMITER ;

调用

CALL show_min_salary(@ms);

查看

SELECT @ms;

类型3:IN类型
案例4:创建存储过程show_someone_salary(),查看表的某个员工工资,并用IN参数empname输入员工姓名

DELIMITER $
	CREATE PROCEDURE show_someone_salary(IN empname VARCHAR(20))
	BEGIN
		SELECT salary FROM employees
		WHERE last_name=empname;
	END $
	DELIMITER ;

调用方式1

CALL show_someone_salary('Abel');

调用方式2

SET @empname ='Abel';
CALL show_someone_salary(@empname);

类型4:带IN和OUT类型
案例5:创建存储过程show_someone_salary2(),查看employees表某个员工的薪资,并用IN参数empname输入员工姓名,用OUT参数empsalary输出员工薪资

DELIMITER $
	CREATE PROCEDURE show_someone_salary2(IN empname VARCHAR(20),OUT empsalary DECIMAL(10,2))
	BEGIN
		SELECT salary INTO empsalary
		FROM employees
		WHERE last_name=empname;
	END $
	DELIMITER ;

调用

SET empname='Abel';
CALL show_someone_salary2(@empname,@empsalary);
Select @empsalary;

类型5:带INOUT类型
案例6:创建存储过程show_mgr_name(),查询某个员工领导的名字,并用INOUT参数“empname"输入员工姓名,输出员工领导姓名

DELIMITER $
	CREATE PROCEDURE show_mgr_name(INOUT empname VARCHAR(25))
	BEGIN
		SELECT last_name INTO empname FROM employees WHERE employee_id=(
			SELECT manager_id FROM employees WHERE last_name =empname
		);
	END $
	DELIMITER;

调用

SET @empname :='Abel';
CALL show_mgr_name(@empname);
SELECT @empname;

二.存储函数的使用

一.语法:

	**CREATE FUNCTION 函数名(参数名 参数类型,…)
	RETURNS 返回值类型
	[characteristics …]
	BEGIN
		函数体 (函数体中肯定有return语句)
	END**

案例1:创建存储函数,名称为email by name(),参数定义为空,该函数查询Abel的email,并返回,数据类型为字符串型

DELIMITER $
	CREATE FUNCTION email_by_name() 
	RETURNS VARCHAR(25)
		DETERMINISTIC
		CONTAINS SQL
		READS SQL DATA
	BEGIN
		RETURN (SELECT email FROM employees WHERE last_name='Abel');
	END $
	DELIMITER ;
	

案例2:创建存储函数,名称为email_by_id(),参数传入emp_id,该函数查询emp_id的email并返回,数据类型为字符串类型

SET GLOBAL log_bin_trust_function_creators=1;//设置charactistic
	DELIMITER $
	CREATE FUNCTION email_by_id(emp_id INT)
	RETURNS VARCHAR(25)
	BEGIN
		RETURN (SELECT email FROM employees WHERE employee_id=emp_id);
	END $
	DELIMITER ;

调用

Select email_by_id(100);

二.存储过程与存储函数的对比:

存储过程(PROCEDURE):

调用方式:CALL 存储过程()
返回值:有0个或多个
应用场景:一般用于更新

存储函数(FUNCTION):

调用方法:SELECT 函数()
返回值:只能是1个
应用场景:一般用于查询结果为一个值并返回时

三.存储过程和函数的查看,修改,删除

一.查看

1.show create 语句查看存储过程和函数的创建信息

SHOW CREATE PROCEDURE show_mgr_name;
		
SHOW CREATE FUNCTION email_by_name;

2.使用show status 语句查看存储过程和函数的状态信息

SHOW PROCEDURE STATUS LIKE 'show_max_salary';
	
SHOW FUNCTION STATUS LIKE 'email_by_name';

3.从information_schema.Routines表中查看存储过程和函数的信息

SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME='email_by_id';

二.存储函数和存储过程的修改

只修改特性,不修改函数体,使用ALTER语句实现

ALTER PROCEDURE show_min_salary SQL SECURITY INVOKER COMMENT '查询最低工资';

三.存储过程、函数的删除

DROP FUNCTION IF EXISTS count_by_id;

四.优缺点

一.优点

1.存储过程可以一次编译多次使用
2.减少开发工作量
3.存储过程的安全性强
4.减少网络传输量
5.良好的封装性

二.缺点

1.可移植性差
2.调试困难
3.存储过程的版本管理很困难
4.不适合高并发的场景

如果你喜欢我的文章的话记得点赞加收藏支持我一下哦~
想要获得更多资源,敬请关注“小呆呆学编程”微信公众号,你的关注就是我最大的动力

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漩涡编程,一鸣惊人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值