- 存储过程:SQL中的“脚本”
1.创建存储过程
2.调用存储过程
3.存储过程体
4.语句块标签
- 存储过程的参数
1.in:向过程里传参
2.out:过程向外传参值
3.inout:既实现in又实现out in and out
SQL语句:先编译后执行
存储过程:
一组可编程的函数,是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
优点:
- 存储过程是预编译的,而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些
- 将重复性很高的一些操作,封装到一个存储过程中,简化了对这些SQL的调用
- 统一了接口,确保数据的安全
存储过程的创建和调用:
- 存储过程就是一段具有名字的代码,用来完成某个特定的操作
- 创建的存储过程保存在数据库的数据字典中
- 创建存储过程使用procedure关键字
创建表tb_stu并在表中插入如下数据:
+------+------+------+------------+
| id | name | sex | birthday |
+------+------+------+------------+
| 2 | 小红 | 女 | 2008-07-06 |
| 1 | 小明 | NULL | NULL |
| 3 | 小明 | 男 | 2011-07-10 |
| 4 | 张三 | 男 | 2005-06-22 |
| 4 | 小黄 | 女 | 2007-04-22 |
| 4 | 李四 | 男 | 2001-06-29 |
+------+------+------+------------+
示例:创建存储过程删除sex列为"男"的记录
mysql> delimiter $$ #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
mysql> create procedure delete_tb_stu(in p_sex varchar(255))
-> begin
-> delete from tb_stu
-> where sex = p_sex;
-> end$$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ; #将语句的结束符号恢复为分号
解析:我们创建了一个叫delete_tb_stu的存储过程,内容被包括在begin...end语句块内,我们在定义过程时,使用DELIMITER $$ 命令将语句的结束符号从分号 ; 临时改为两个$$,使得过程体中使用的分号被直接传递到服务器,而不会被客户端(如mysql)解释(内容中的分号必须要)。
调用存储过程(call sp_name[(传参)];):
mysql> select * from tb_stu;
+------+------+------+------------+
| id | name | sex | birthday |
+------+------+------+------------+
| 2 | 小红 | 女 | 2008-07-06 |
| 1 | 小明 | NULL | NULL |
| 3 | 小明 | 男 | 2011-07-10 |
| 4 | 张三 | 男 | 2005-06-22 |
| 4 | 小黄 | 女 | 2007-04-22 |
| 4 | 李四 | 男 | 2001-06-29 |
+------+------+------+------------+
6 rows in set (0.00 sec)
mysql> call delete_tb_stu("男");
Query OK, 3 rows affected (0.00 sec)
mysql> select * from tb_stu;
+------+------+------+------------+
| id | name | sex | birthday |
+------+------+------+------------+
| 2 | 小红 | 女 | 2008-07-06 |
| 1 | 小明 | NULL | NULL |
| 4 | 小黄 | 女 | 2007-04-22 |
+------+------+------+------------+
3 rows in set (0.00 sec)
存储内容体:
>存储过程体包含了在过程调用时必须执行的语句,例如:dml、ddl语句,if-then-else和while-do语句、声明变量的declare语句等
>过程体格式:以begin开始,以end结束(可嵌套)
begin
begin
begin
statements;
end
end
end
存储过程的参数:
存储过程可以有0个或多个参数,用于存储过程的定义。
3种参数类型:
- in输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
- out输出参数:表示过程向调用者传出值(可以返回多个值,传出值只能是变量)
- inout输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
注意:即使过程没有参数,也必须在过程名后面加上小括号
删除存储过程:
mysql> drop procedure delete_tb_stu;
Query OK, 0 rows affected (0.00 sec)