自己重新梳理一遍,也是一个消化的过程。学习一定要注重输入和输出,如果只输入的话,很多时候只是大脑此刻懂了,但并未记住。这样在实际做题或应用时,就无从下笔了。
存储过程
和存储函数
可以将复杂的SQL逻辑封装在一起
,应用程序无需关注存储过程和函数内部复杂的SQL逻辑,只需要简单地调用存储过程和函数即可。
思想
预先编译
的SQL语句的封装执行过程
优点:
缺点:
使用
存储过程没有返回值
DELIMITER $ -- 新的结束标记
CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型, IN|OUT|INOUT 参数名 参数类型, ...)
[characteristics ...] -- 存储过程的约束条件
--LANGUAGE SQL
--| [NOT] DETERMINISTIC
--| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
--| SQL SECURITY { DEFINER | INVOKER } -- 安全级别(定义者可以调用 | 有权限就可以调用),默认为DEFINER
--| COMMENT 'string'
BEGIN
查询语句
END $
DELIMITER ; -- 恢复结束标记
$
、//
SET
:赋值语句,对变量进行赋值。SELECT INTO
:将赋值语句的查询结果存放到变量中,也就是为变量赋值。①没有参数(无参数无返回)
②IN
(由参数无返回)
③OUT
(无参数有返回)
④IN和OUT
(有参数有返回)
⑤INOUT
(有参数有返回)
CALL 存储过程名(实参列表)
①查看存储过程的创建信息
SHOW CREATE PROCEDURE 存储过程名
②查看存储过程的状态信息
SHOW PROCEDURE STATUS [LIKE '...']
ALTER PROCEDURE 存储函数名
DROP PROCEDURE IF EXIST 存储函数名;
用于查询
有且仅有一个返回值
DELIMITER //
CREATE FUNCTION 存储函数名(参数名, 参数类型)
RETURNS 返回值类型
# 为了避免报错,需要加上下面三行
DETERMINISTIC --
CONTAINS SQL -- 包含SQL
READS SQL DATA
BEGIN
RETURN(SELECT查询语句);
END //
DELIMITER; --把结束符号重新设为`;`
或
# 为避免报错,需要加这一句
SET GLOBAL log_bin_trust_function_creators = 1;
DELIMITER //
CREATE FUNCTION 存储函数名(参数名1 参数类型, 参数名2 参数类型, ...)
RETURNS 返回值类型
BEGIN
RETURN(SELECT查询语句);
END //
DELIMITER; --把结束符号重新设为`;`
SELECT 存储函数名(); -- 调用函数
SET @emp_id := 102; -- 定义变量
# SET @emp_id = 102; `:=`和`=`都可以
SELECT 存储函数名(@emp_id); --调用函数
巧记:因为
存储函数
适用于查询,所以调用它也用SELECT
。
①查看存储函数的创建信息
SHOW CREATE FUNCTION 存储函数名
②查看存储函数的状态信息
SHOW FUNCTION STATUS [LIKE '...']
ALTER FUNCTION 存储函数名
DROP FUNCTION IF EXIST 存储函数名;