MySQL的存储函数与存储过程相关概念与具体实例详解
作者:瀛台夜雪 发布时间:2024-01-19 05:50:32
MySQL存储过程与存储函数的相关概念
存储函数和存储过程的主要区别:
存储函数一定会有返回值的
存储过程不一定有返回值
存储过程和函数能后将复杂的SQL逻辑封装在一起,应用程序无需关注存储过程和函数内部复杂的SQL逻辑,而只需要简单地调用存储过程和函数即可
存储过程
一组预先编译的SQL语句的封装
执行过程:执行过程预先存储在MySQL服务器上,需要执行的时候,客户端只需要向服务器发出调用存储过程的命令,服务器端就可以把预先存储好的这一系列SQL语句全部执行
简化操作,提高了SQL语句的重用性,减少了开发程序员的压力
减少操作过程中的失误,提高效率
减少网路传输量,客户端不需要将所有的SQL语句通过网络发给服务器
减少SQL语句暴露在网上的风险,提高数据查询的安全性
与视图,函数的对比:
视图:是虚拟表,通常不对底层数据表直接操作
存储过程:程序化的SQL,可以直接操作底层数据表,相比于面向集合的操作方式,能够实现一些更复杂的数据处理
相较于函数,存储过程没有返回值
分类
没有参数(无参数无返回)
仅仅带有IN 类型 (有参数无返回)
仅仅带OUT类型(无参数有返回)
即带IN又带OUT(有参数有返回)
带INOUT(有参数有返回)
创建存储过程
DELIMITER $
CREATE PROCEDURE 存储过程名 (IN|OUT|INOUT 参数名 参数类型,...)
[characteristics]
BEGIN
存储过程体
END $DELIMITER ;
DELIMITER $
CREATE PROCEDURE select_all_data()
BEGIN
SELECT *
FROM employees;
END $
DELIMITER ;
调用存储过程
CALL select_all_data();
无参数无返回值
DELIMITER //
CREATE PROCEDURE avg_employee_salary()
BEGIN
SELECT AVG(salary) FROM emp;
END //
DELIMITER ;
CALL avg_employee_salary();
无参数有返回值
DELIMITER //
CREATE PROCEDURE show_min_salart(OUT ms DOUBLE)
BEGIN
SELECT MIN(salary) INTO ms
FROM emp;
END //
DELIMITER ;
CALL show_min_salart(@ms);
SELECT @ms;
有参数无返回值
DELIMITER //
CREATE PROCEDURE show_someone_salary(IN empname VARCHAR(20))
BEGIN
SELECT salary
FROM emp
WHERE last_name=empname;
END //
DELIMITER ;
CALL show_someone_salary('Abel');
SET @empname='Abel';
CALL show_someone_salary(@empname)
有参数有返回值
DELIMITER //
CREATE PROCEDURE show_someone_salary2(IN empname VARCHAR(20),OUT empsalary DECIMAL(10,2))
BEGIN
SELECT salary INTO empsalary
FROM emp
WHERE last_name=empname;
END //
DELIMITER ;
SET @empname='Abel';
CALL show_someone_salary2(@empname,@empsalary);
SELECT @empsalary;
带INOUT
DELIMITER //
CREATE PROCEDURE show_mgr_name(INOUT empname VARCHAR(25))
BEGIN
SELECT last_name
FROM emp
Where employee_id=
(
SELECT manager_id
FROM emp
WHERE last_name=empname
);
END //
DELIMITER ;
SET @empname='Abel';
CALL show_mgr_name(@empname);
SELECT @empname;
如何调试
通过SELECT语句,把程序执行的中间结果查询出来,从而调试一个SQL语句的正确性。调试成功之后,把SELECT语句后移到下一个SQL语句,逐步推进查询下一个 SQL语句
存储函数
MySQL允许用户自定义函数,自定义好了之后,调用方式与调用MySQL预定义的系统函数一样
创建存储函数
CREATE FUNCTION 函数名(参数名 参数类型)
RETURUNS 返回值类型
[characteristics]
BEGIN
函数体 #函数体中肯定有RETURN语句
END
参数类型,FUNCTION 中总是默认为IN参数
RETURNS type 表示函数返回数据的类型,对于函数而言是强制的
characteristics 表示创建函数时指定的对函数的约束
函数题可以用BEGIN … END表示SQL代码的开始和结束。如果函数体只有一条语句,则可以省略BEGIN … END
调用存储函数
SELECT 函数名(实参列表)
练习一
DELIMITER //
CREATE FUNCTION email_by_name()
RETURNS VARCHAR(25)
BEGIN
RETURN
(
SELECT email
FROM emp
WHERE last_name='Abel'
);
END //
DELIMITER ;
SELECT email_by_name();
练习2
DELIMITER //
CREATE FUNCTION email_by_id(emp_id INT)
RETURNS VARCHAR(25)
BEGIN
RETURN
(
SELECT email
FROM emp
WHERE employee_id=emp_id
);
END //
DELIMITER ;
SELECT email_by_id(101);
SET @emp_id=102;
SELECT email_by_id(@emp_id);
存储函数与存储过程的对比
存储过程 PEOCEDURE 存储函数 FUNCTION
调用语法 CALL 存储过程 SELECT 存储函数
存储过程返回值可以有0个或对各 存储函数返回值只有一个
存储过程一般用于更新操作 存储函数一般用于查询结果为一个值并返回
存储函数可以放在查询语句中使用,存储过程则不行
存储过程功能更为强大,包括能够执行对表的操作(创建表,删除表)和事务操作,这些功能是存储函数并不具备的
存储过程和函数的查看修改删除
查看
使用SHOW CREATE 语句 查看创建信息
SHOW CREATE PROCEDURE show_mgr_name\G;
SHOW CREATE FUNCTION email_by_id\G;
使用SHOW STATUS 语句查看存储过程和函数的状态信息
SHOW PROCEDURE STATUS;
SHOW PROCEDURE STATUS LIKE 'show_mgr_name' ;
SHOW FUNCTION STATUS LIKE 'email_by_name' ;
从information_schema.Routines表中查看存储过程和函数的信息
SELECT * FROM information_schema.ROUTINES
WHERE ROUTINE_NAME='email_by_id' AND ROUTINE_TYPE='FUNCTION';
SELECT * FROM information_schema.ROUTINES
WHERE ROUTINE_NAME='show_min_salart' AND ROUTINE_TYPE='PROCEDURE';
修改存储过程与函数
修改存储过程或函数,不影响存储过程或函数功能,只是修改相关特征,使用ALTER语句实现
ALTER PROCEDURE|FUNCTION 存储过程或函数名 [characteristic ...]
删除存储过程或函数
DROP PROCEDURE|FUNCTION [IF EXISTS] 存储过程或函数名
来源:https://blog.csdn.net/sxycylq/article/details/129226240


猜你喜欢
- 写在前面的话:此篇还是asp相关的,相信玩ASP的都有这个感觉,当数据有5万多条时-------just like音乐网,要调用最新的10条
- 前言最近在使用Pycharm,在运行或者安装的过程中出现了各种各样的报错,前面已经介绍过安装pygame出现报错的解决方法。文章总结了大部分
- 1.引入库需要用到3个类,ElementTree,Element以及建立子类的包装类SubElementfrom xml.etree.Ele
- multiprocessing.Pipe([duplex]) 返回2个连接对象(conn1, conn2),代表管道的两端,默认是双向通信.
- Flask-sqlalchemy是关于flask一个针对数据库管理的。文中我们采用一个关于员工显示例子。首先,我们创建SQLALCHEMY对
- 今天来分享python学习的一个小例子,使用python暴力破解mysql数据库,实现方式是通过UI类库tkinter实现可视化面板效果,在
- 程序一:负责从字典中随机提取数据,写入一个新文件。(1.php) <?php /* 从字典文件中提取随机值 */
- 1 中国结的组成部分中国结是一种手工编织工艺品,它身上所显示的情致与智慧正是汉族古老文明中的一个侧面。因为其外观对称精致,可以代表汉族悠久的
- mysql 8.0.20 安装配置方法图文教程整理下,供大家参考。一、准备工作1、检查是否已经安装mysql当前计算机没有安装mysql。2
- antd form表单使用setFildesValue 赋值失效加上this.$nextTick(()=>{})即可this.$nex
- 使用SQL语句从电脑导入图片到数据库的方法,具体代码如下所示:--创建图片表CREATE TABLE W_PIC( ID INT
- Mysql安装、配置、优化,供大家参考,具体内容如下Mysql下载首先登入官网下载mysql的安装包,官网地址https://dev.mys
- php获取 checkbox复选框值的方法 <html xmlns="https://www.aspxhome.net/19
- JS获取网页中HTML元素的几种方法分析:getElementById getElementsByName getElementsByTag
- 我们通常情况下要统计数据库的连接数指的是统计总数,没有细分到每个IP上。现在要监控每个IP的连接数,实现方式如下:方法一:select SU
- 道友问我的一个问题,之前确实没遇见过,在此记录一下。问题描述在某网站主页提取url进行迭代,爬虫请求主页时没有问题,返回正常,但是在访问在主
- 关于跨域这个话题,很早就答应过要分享,但是因为懒,一直拖着,直到D2上有人谈起了“完美跨域”。“跨域”应该已经算不上什么难题了,只是提起“完
- 最近在内部讨论关于”完美三栏”的话题,看到一篇”In Search of the Holy Grail“,相当的好.故此翻译之.In Sea
- ES6添加了Promise对象,成功时在then中处理,失败则在catch中处理,但有时候,我们需要在无论成功或失败时都要做一些事,比如隐藏
- PHP PDO 预处理语句与存储过程很多更成熟的数据库都支持预处理语句的概念。什么是预处理语句?可以把它看作是想要运行的 SQL 的一种编译