概念
- 存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用
- 存储过程中可以包含逻辑控制语句和数据操纵语句, 它可以接受参数 , 输出参数 ,返回单个或多个结果集以及返回值
优缺点
优点
- 由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中 , 所以存储过程运行要比单个的SQL语句块要快;
- 由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量,减少网络负担;
- 可维护性高,更新存储过程通常比更改sql以及重新部署程序集需要较少的时间和精力;
- 增强安全性:
- 通过向用户授予对存储过程(而不是基于表)的访问权限,它们可以提供对特定数据的访问;
- 提高代码安全,防止SQL注入(但未彻底解决,例如将数据操作语言DML附加到输入参数);
- SQLParameter类指定存储过程参数的数据类型,作为深层次防御性策略的一部分,可以验证用户提供的值类型(但也不是万无一失,还是应该传递至数据库前得到附加验证);
缺点
- 如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则仍需要更新程序集中的代码以添加参数;
- 可移植性差,由于存储过程将应用程序绑定到Server,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。
语法
CREATE PROCEDURE proc_name ([IN | OUT | INOUT param_name type [,...]])
[characteristic ...]
BEGIN
routine_body
END;
参数说明
- proc_name:表示存储过程的名称
- [IN | OUT | INOUT param_name type:表示存储过程的参数,它们分别是输入输出类型,参数名称和参数类型。其中,IN表示输入参数;OUT表示输出参数。param_name参数是存储过程参数名称;type参数是指定存储过程的参数类型,该类型可以为MySQL数据库的任意数据类型
- routine_body:表示SQL代码的内容。包含局部变量、逻辑代码、sql语句…
局部变量
逻辑控制语句
调用
所有变量都必须以@开始,若没有则不填
CALL proc_name([parameter[,…]]);
例如:call GetScores(@minScore, @avgScore, @maxScore);
删除
DROP PROCEDURE IF EXISTS proc_name;
实例
根据 prodID 获取货品的价格,并根据参数判断是否折扣
假数据添加(存储过程)
执行CALL proc_initData() 这一步可能会有点慢,耐心等待!
DROP PROCEDURE IF EXISTS proc_initData;
CREATE PROCEDURE proc_initData()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i<=20000 DO
INSERT INTO `usr_shxf_wjdc`.`t_dj_eclub` (`wid`, `author`, `createDate`, `title`, `content`, `type`) VALUES (uuid(), '赛文', '2019-08-03', '标题一', 'fdsfds', '3');
SET i = i+1;
END WHILE;
END;
CALL proc_initData();