存储过程
MySQL 从 5.0 开始起就支持存储过程和函数了。
那么什么是存储过程呢?
「存储过程是在数据库系统中完成一组特定功能的 SQL 语句集」,它存储在数据库系统中,一次编译后永久有效。那么使用存储过程有什么优点呢?
- 使用存储过程具有可封装性,能够隐藏复杂的 SQL 逻辑。
- 存储过程可以接收参数,并返回结果
- 存储过程性能非常高,一般用于批量执行语句
使用存储过程有什么缺点?
- 存储过程编写复杂
- 存储过程对数据库的依赖性比较强,可移植性比较差
存储过程使用
存储过程创建
在认识到存储过程是什么之后,我们就来使用一下存储过程,这里需要先了解一个小技巧,也就是 delimiter
的用法,delimiter 用于自定义结束符,什么意思呢,如果你使用
delimiter $$
的话,那么你在 sql 语句末使用 ;
是不能使 SQL 语句执行的,不信?我们可以看下
可以看到,我们在 SQL 语句的行末使用了 ;
但是我们却没有看到执行结果。下面我们使用
delimiter ;
恢复默认的执行条件再来看下
我们创建存储过程首先要把 ;
替换为 $$
,下面是一个存储过程的创建语句
mysql> delimiter $$ mysql> create procedure sp_product() -> begin -> select * from product; -> end $$
存储过程实际上是一种函数,所以创建完毕后,我们可以使用 call
方法来调用这个存储过程
因为我们上面定义了使用 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;
然后进行查询,查询会话变量使用
或者使用