十一,存储过程和存储函数
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; ```