1.应用
1)创建存储过程
CREATE PROCEDURE p (OUT ver_param VARCHAR(25), INOUT incr_param INT)
BEGIN
# Set value of OUT parameter
SELECT VERSION() INTO ver_param;
# Increment value of INOUT parameter
SET incr_param = incr_param + 1;
END;
2)使用存储过程
mysql> SET @increment = 10;
mysql> CALL p(@version, @increment);
mysql> SELECT @version, @increment;
+--------------------+------------+
| @version | @increment |
+--------------------+------------+
| 8.0.3-rc-debug-log | 11 |
+--------------------+------------+
API
1.语法
CREATE PROCEDURE p_name (IN param_in type,OUT param_out type, INOUT param_inout type)
BEGIN
sql_statement;
END;
- 过程名:p_name
- 过程参数:
IN:输入参数,参数名,类型
OUT:输出参数,参数名,类型
INOUT:输入输出参数,参数名,类型
需要注意的是,参数的取名不要与数据表的列名相同,否则尽管不会返回出错信息,但是存储过程的 SQL 语句会将参数名看作列名,从而引发不可预知的结果。 - 过程体:以BEGIN开始,以END结束
未验证的信息
在 MySQL 中,服务器处理 SQL 语句默认是以分号作为语句结束标志的。然而,在创建存储过程时,存储过程体可能包含有多条 SQL 语句,这些 SQL 语句如果仍以分号作为语句结束符,那么 MySQL 服务器在处理时会以遇到的第一条 SQL 语句结尾处的分号作为整个程序的结束符,而不再去处理存储过程体中后面的 SQL 语句。所以使用`DELIMITER $$`来改变结束符。
2.好处
1)封装性,相当于定义了函数
2)减少网络IO,全部在服务端运行,且比多次执行sql效率高
3)存储过程执行一次后,产生的二进制代码被缓存,再次调用的时候省去编译过程。
参考:
https://www.cnblogs.com/ccstu/p/12182933.html
https://dev.mysql.com/doc/refman/8.0/en/create-procedure.html
https://www.zhihu.com/question/57545650 为什么阿里巴巴禁用存储过程?要看具体的业务场景