【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;
相关推荐
这个DBA有点耶3 小时前
NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑
数据库·mysql·代码规范
这个DBA有点耶5 小时前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技5 小时前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend6 小时前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
ClouGence9 小时前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
先吃饱再说1 天前
存储的进化:从 MySQL 到浏览器缓存,数据到底住在哪?
数据库
Nturmoils1 天前
字段太多看不全,ksql 的展开模式和输出控制怎么用
数据库·后端
Databend1 天前
Agent 轨迹分析与归因的数据工程实践
大数据·数据库·agent
这个DBA有点耶1 天前
SQL改写进阶:标量子查询的“隐形代价”与消除实战
数据库·mysql·架构
smallyoung1 天前
数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南
数据库·mysql·postgresql