【MySQL】第十一章 存储过程和存储函数

十一,存储过程和存储函数

1,存储过程的概述

含义:它的思想很简单,就是一组经过 预先编译 的 SQL 语句的封装。

执行过程:存储过程预先存储在 MySQL 服务器上 ,需要执行的时候,客户端只需要向服务器端发出调用存储过程的命令,服务器端就可以把预先存储好的这一系列 SQL 语句全部执行。

1、简化操作,提高sql语句的重用性,减少了开发程序员的压力 2、减少操作过程中的失误,提高效率 3、减少网络传输量(客户端不需要把所有的 SQL 语句通过网络发给服务器) 4、减少了 SQL 语句暴露在网上的风险,也提高了数据查询的安全性

对于存储过程的分类存 储过程的参数类型可以是IN、OUT和INOUT。根据这点分类如下:

1、没有参数(无参数无返回) 2、仅仅带 IN 类型(有参数无返回) 3、仅仅带 OUT 类型(无参数有返回) 4、既带 IN 又带 OUT(有参数有返回) 5、带 INOUT(有参数有返回) 注意:IN、OUT、INOUT 都可以在一个存储过程中带多个。

2,存储过程的创建
sql 复制代码
CREATE PROCEDURE 存储过程名(IN/OUT/INOUT 参数名 参数类型)
[characteristics...] --- 表示创建存储过程时指定的对存储过程的约束条件
BEGIN
    存储过程主体 如: SELECT * FROM employees;
END

这里的对于创建指定存储过程的约束条件,这里暂时放一下,等到后面需要再进行复习 问题: 当在写存储过程主体的时候,每一个句子后面都会接一个;,那么就无法区分开存储过程的结束句子在哪里,这个时候需要改变这个结束符号

解决方法: 因为MySQL默认的语句结束符号为分号';'。为了避免与存储过程中SQL语句结束符相冲突,需要使用DELIMITER改变存储过程的结束符

sql 复制代码
DELIMITER $  # 这里的符号是任意取得,也可以%
CREATE PROCEDURE output()
BEGIN
​
SELECT * FROM employees
​
END $
DELIMITER ;

例子说明

sql 复制代码
DESC employees;
​
DELIMITER //
​
CREATE PROCEDURE show_min_salary(OUT ms DOUBLE)
BEGIN
    SELECT MIN(salary) INTO ms  # 这里需要把SELECT查询得结果存储到ms变量里面
    FROM employees;
END //
​
DELIMITER ;
​
#调用
SET @ms;   # 这里表示声名一个变量ms,这里可以给ms进行赋值
CALL show_min_salary(@ms);  # @表示这里涉及一个变量 变量名为ms   调用存储过程要使用CALL
​
#查看变量值
SELECT @ms;  # 查看ms这个变量得数值
3,存储函数的概念
sql 复制代码
DELIMITER $
​
CREATE FUNCTION 函数体(IN/OUT/INOUT 参数名 参数类型)
RETURN 返回值类型
[characteristics...]  --- 对于创建存储函数,函数的约束条件是一定要创建的
​
BEGIN
    SELECT * FROM 
END
​
DELIMITER ;
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'

LANGUAGE SQL :说明存储过程执行体是由SQL语句组成的,当前系统支持的语言为SQL。

NOT DETERMINISTIC :指明存储过程执行的结果是否确定。DETERMINISTIC表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。NOT DETERMINISTIC表示结果是不确定的,相同的输入可能得到不同的输出。如果没有指定任意一个值,默认为NOT DETERMINISTIC。

{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } :指明子程序使用SQL语句的限制。

CONTAINS SQL表示当前存储过程的子程序包含SQL语句,但是并不包含读写数据的SQL语句; NO SQL表示当前存储过程的子程序中不包含任何SQL语句; READS SQL DATA表示当前存储过程的子程序中包含读数据的SQL语句; MODIFIES SQL DATA表示当前存储过程的子程序中包含写数据的SQL语句。

默认情况下,系统会指定为CONTAINS SQL

SQL SECURITY { DEFINER | INVOKER } :执行当前存储过程的权限,即指明哪些用户能够执行当前存储过程。 DEFINER 表示只有当前存储过程的创建者或者定义者才能执行当前存储过程; INVOKER 表示拥有当前存储过程的访问权限的用户能够执行当前存储过程。

4,创建存储函数
sql 复制代码
DELIMITER $
​
CREATE FUNCTION my_function()
RETURN DOUBLE
    LONGUAGE SQL
    NOT DETERMINSTIC
    CONSTAINS SQL
    SQL SECURITY DEFINER
BEGIN
RETURN (SELECT COUNT(*) FROM employees WHERE department_id = dept_id);
END //
DELIMITER ;
​
SELECT email_by_name();
​
# 如果不想写这个约束条件可以写这个
SET GLOBAL log_bin_trust_function_creators = 1;
复制代码

5,存储过程和存储函数的修改,删除

sql 复制代码
#3. 存储过程、存储函数的查看
​
#方式1. 使用SHOW CREATE语句查看存储过程和函数的创建信息
​
SHOW CREATE PROCEDURE show_mgr_name;
​
SHOW CREATE FUNCTION count_by_id;
​
#方式2. 使用SHOW STATUS语句查看存储过程和函数的状态信息
​
SHOW PROCEDURE STATUS;
​
SHOW PROCEDURE STATUS LIKE 'show_max_salary';
​
SHOW FUNCTION STATUS LIKE 'email_by_id';
​
#方式3.从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_salary' AND ROUTINE_TYPE = 'PROCEDURE';
​
#4.存储过程、函数的修改 (这里的存储函数和过程不是修改函数体,而是修改函数约束条件)
ALTER PROCEDURE show_max_salary
SQL SECURITY INVOKER
COMMENT '查询最高工资';
​
#5. 存储过程、函数的删除
​
DROP FUNCTION IF EXISTS count_by_id;
​
DROP PROCEDURE IF EXISTS show_min_salary;
相关推荐
努力进修6 小时前
“数据心脏” 驱动能源自主:国产数据库支撑 Cemsol 实现固井全流程数字化闭环
数据库·人工智能·能源
vHelios7 小时前
SQL不会写?不会找关联表?复杂SQL语句编写逻辑实现思路请查收✉
数据库·sql
DB哥讲数据库7 小时前
【ClickHouse安装教程】从零开始部署高性能列式数据库(附ClickHouse安装包)
数据库·clickhouse
TDengine (老段)7 小时前
TDengine 第三方工具 — Telegraf、Kafka Connect、Flink、Spark
大数据·数据库·物联网·flink·kafka·时序数据库·tdengine
小白勇闯网安圈16 小时前
Django 响应对象、文件上传与类视图
数据库·django·sqlite
努力的小雨17 小时前
同一份 SQL 跑多套环境:Ksql 变量怎么用才安全
数据库
科技绘图17 小时前
快鲸GEO vs 传统AI搜索优化:全链路自动化与高效内容生产在转化闭环上的对比
数据库·人工智能·自动化
ltl18 小时前
数据库作为 LLM 记忆体:语义缓存、RAG 与一致性
数据库
ltl18 小时前
WAL 与崩溃恢复:ARIES 协议怎么跑通
数据库
ltl18 小时前
TEE 数据库:EnclaveDB、Oblivious 原语与机密 SQL
数据库