存储过程
MySQL 从 5.0 开始起就支持存储过程和函数了。
那么什么是存储过程呢?
「存储过程是在数据库系统中完成一组特定功能的 SQL 语句集」,它存储在数据库系统中,一次编译后永久有效。那么使用存储过程有什么优点呢?
- 使用存储过程具有可封装性,能够隐藏复杂的 SQL 逻辑。
- 存储过程可以接收参数,并返回结果
- 存储过程性能非常高,一般用于批量执行语句
使用存储过程有什么缺点?
- 存储过程编写复杂
- 存储过程对数据库的依赖性比较强,可移植性比较差
存储过程使用
存储过程创建
在认识到存储过程是什么之后,我们就来使用一下存储过程,这里需要先了解一个小技巧,也就是 delimiter
的用法,delimiter 用于自定义结束符,什么意思呢,如果你使用
delimiter $$
的话,那么你在 sql 语句末使用 ;
是不能使 SQL 语句执行的,不信?我们可以看下
可以看到,我们在 SQL 语句的行末使用了 ;
但是我们却没有看到执行结果。下面我们使用
delimiter ;
恢复默认的执行条件再来看下
我们创建存储过程首先要把 ;
替换为 $$
,下面是一个存储过程的创建语句
mysql> delimiter $$
mysql> create procedure sp_product()-> begin
-> select * from product;
-> end $$</span></span></pre></div></div></div><p style="text-align:center;font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px"><span class="lake-card-margin-top lake-card-margin-bottom"><img src="https://ucc.alicdn.com/pic/developer-ecology/0d61dd36cd9545c5853520edf026bff4.png" class="image lake-drag-image" alt="37.png" title="37.png" style="width:805px" /></span></p><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">存储过程实际上是一种函数,所以创建完毕后,我们可以使用 <code style="font-family:monospace;font-size:inherit;background-color:rgba( 0 , 0 , 0 , 0.06 );padding:0px 2px;border:1px solid rgba( 0 , 0 , 0 , 0.08 );border-radius:2px;line-height:inherit;text-indent:0px">call</code> 方法来调用这个存储过程</p><p style="text-align:center;font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px"><span class="lake-card-margin-top lake-card-margin-bottom"><img src="https://ucc.alicdn.com/pic/developer-ecology/4e0e7f60cb524a49901843d87e7efa8e.png" class="image lake-drag-image" alt="38.png" title="38.png" style="width:836px" /></span></p><p style="font-size:14px;color:rgb( 38 , 38 , 38 );line-height:1.74;letter-spacing:0.05em;outline-style:none;margin:0px">因为我们上面定义了使用 delimiter $$ 来结尾,所以这里也应该使用。
存储过程也可以接受参数,比如我们定义一种接收参数的情况
然后我们使用 call
调用这个存储过程
可以看到,当我们调用 id = 2 的时候,存储过程的 SQL 语句相当于是
select * from product where id = 2;
所以只查询出 id = 2 的结果。
存储过程删除
一次只能删除一个存储过程,删除存储过程的语法如下
drop procedure sp_product ;
直接使用 sp_product 就可以了,不用加 ()
。
存储过程查看
存储过程创建后,用户可能需要需要查看存储过程的状态等信息,便于了解存储过程的基本情况
我们可以使用
show create procedure proc_name;
变量的使用
在 MySQL 中,变量可分为两大类,即系统变量
和用户变量
,这是一种粗略的分法。但是根据实际应用又被细化为四种类型,即局部变量、用户变量、会话变量和全局变量。
用户变量
用户变量是基于会话变量
实现的,可以暂存,用户变量与连接有关,也就是说一个客户端定义的变量不能被其他客户端使用看到。当客户端退出时,链接会自动释放。我们可以使用 set
语句设置一个变量
set @myId = "cxuan";
然后使用 select
查询条件可以查询出我们刚刚设置的用户变量
用户变量是和客户端有关系,当我们退出后,这个变量会自动消失,现在我们退出客户端
exit
现在我们重新登陆客户端,再次使用 select
条件查询
发现已经没有这个 @myId
了。
局部变量
MySQL 中的局部变量与 Java 很类似 ,Java 中的局部变量是 Java 所在的方法或者代码块,而 MySQL 中的局部变量作用域是所在的存储过程。MySQL 局部变量使用 declare
来声明。
会话变量
服务器会为每个连接的客户端维护一个会话变量。可以使用
show session variables;
显示所有的会话变量。
我们可以手动设置会话变量
set session auto_increment_increment=1;
或者使用
set @@session.auto_increment_increment=2;
然后进行查询,查询会话变量使用
或者使用
</div>