【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; ```

相关推荐
翔云1234562 小时前
MySQL 中的 utf8 vs utf8mb4 区别
数据库·mysql
数据知道2 小时前
PostgreSQL 实战:索引的设计原则详解
数据库·postgresql
强子感冒了2 小时前
MySQL学习随笔:数据类型与字段约束
学习·mysql
一只酸奶牛^_^2 小时前
解决LinuxDeploy部署mysql、redis数据库无法启动问题。
redis·mysql
老毛肚2 小时前
Spring 6.0基于JDB手写定制自己的ROM框架
java·数据库·spring
CodeBlossom2 小时前
MySQL进阶 索引
数据库·mysql
未来之窗软件服务2 小时前
数据库优化提速(四)数据库数据批量补齐—仙盟创梦IDE
数据库·数据库调优·仙盟创梦ide·东方仙盟
optimistic_chen3 小时前
【Redis系列】分布式锁
linux·数据库·redis·分布式·缓存
xuekai200809013 小时前
GaussDB-SQL优化案例
数据库·sql·gaussdb