数据库存储过程
什么是存储过程
存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。
存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
存储过程的优点
- 提高性能: 存储过程在数据库服务器上预先编译和存储,可以减少每次执行的解析和编译时间,从而提高执行速度。
- 减少网络流量: 客户端只需发送存储过程的调用请求,而不是发送大量的SQL语句,从而减少了网络流量和延迟。
- 增强安全性: 可以限制用户直接访问数据库表,只允许他们通过存储过程进行数据操作,从而提高了数据的安全性和完整性。
- 提高可维护性: 存储过程可以实现业务逻辑的封装,使得逻辑在数据库层面统一管理,易于维护和更新。
- 提高代码复用: 存储过程可以被多个应用程序调用,实现了代码的复用,避免了重复编写相同的逻辑。
存储过程的缺点
- 难以调试: 存储过程的调试相对复杂,特别是当存储过程逻辑较为复杂时,调试可能会变得非常困难。
- 数据库厂商依赖性: 存储过程的语法和特性在不同的数据库管理系统中可能有所不同,导致代码的移植性受到影响。
- 增加数据库复杂性: 过度使用存储过程可能会增加数据库的复杂性,使得数据库结构难以理解和维护。
- 限制了平台独立性: 使用存储过程可能限制了应用程序的平台独立性,因为存储过程通常是特定数据库管理系统的特性。
- 可能导致性能问题: 如果存储过程编写不当,可能会导致性能问题,例如过度的循环、大量的参数传递等都可能影响存储过程的性能表现。
存储过程的创建和调用
存储过程通过procedure关键字来进行定义,存储过程的开始和结束符号由BEGIN…END来标识
1 | create procedure 存储过程名(参数) |
声明语句结束符
1 | DELIMITER $$ |
调用存储过程时通过call关键字来进行调用
1 | call 存储过程名(参数) |
变量赋值
1 | SET @p_in=1 |
变量定义
1 | DECLARE l_int int unsigned default 4000000; |
存储过程使用实例
1 | -- 创建matches表 |
存储过程的参数
1、in输入参数
1 | delimiter $$ |
2、out输出参数
1 | delimiter // |
3、inout输入输出参数
1 | delimiter // |
注意:
1.即使存储过程中没有参数也必须在括号后面写上小括号
2.确保参数的名字不等于列的名字,否则在过程体中,参数名被当做列名来处理
MySQL存储过程的查询、修改与删除
1 | select name from mysql.proc where db='数据库名'; |
MySQL存储过程的变量作用域及控制语句
1、变量的作用域
内部的变量在其作用域范围内享有更高的优先权,当执行到 end。变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储过程外再也不能找到这个声明的变量,但是你可以通过 out 参数或者将其值指派给会话变量来保存其值。
1 | DELIMITER // |
2、控制语句
2.1 if-then-else 语句
1 | DELIMITER // |
2.2 case语句
1 | DELIMITER // |
2.3 循环语句
2.3.1 while ···· end while
1 | DELIMITER // |
2.3.2 repeat···· end repeat
它在执行操作后检查结果,而 while 则是执行前进行检查。
1 | DELIMITER // |
2.3.3 loop ·····endloop
loop 循环不需要初始条件,这点和 while 循环相似,同时和 repeat 循环一样不需要结束条件, leave 语句的意义是离开循环。
1 | DELIMITER // |
2.3.4 ITERATE迭代
ITERATE 通过引用复合语句的标号,来从新开始复合语句:
1 | DELIMITER // |
通过数据存储过程批量创建用户
1 | delimiter $$ |