ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
存储过程是一组为了完成特定功能的预先创建并使用指定名称存储在数据库服务器上的sql语句集合,用户可以通过指定存储过程的名称并给定参数来调用并执行。存储过程是可编程的函数,在数据库中创建并保存,可以由sql语句和控制结构组成。 其实就是一组使用控制结构封装好后存储在数据库服务器上的sql语句。 <br>优点: * 存储过程是预编译的,只在创建时进行编译,在每次执行时不需重新编译,因此使用存储过程可以提高数据库执行效率。 * 存储过程创建一次便可以重复使用 * 实现复杂业务逻辑需要多条sql语句,客户端和服务器之间需要多次请求,会产生大量的网络传输,而存储过程则是直接在数据库服务器上执行的,因此会减少很多网络传输,降低网络负载。 * 安全性高。存储过程可以屏蔽对底层数据库对象的直接访问,使用 EXECUTE 权限调用存储过程,无需拥有访问底层数据库对象的显式权限。 * 在通过网络调用过程时,只有对执行过程的调用是可见的。无法看到表和数据库对象名称,不能嵌入SQL 语句,有助于避免 SQL 注入攻击。 缺点: * 当业务逻辑改动较大,需要重新修改存储过程直接操作数据库 * 很多异常不能再代码中捕获,错误信息排查难度大。 * 过多使用存储过程会降低系统的移植性,对数据库的维护工作量增多。 * 存储过程不太适合面向对象的设计,无法采用面向对象的方式将业务逻辑进行封装,业务逻辑在存储层实现,增加了业务和存储的耦合,代码的可读性也会降低, 应用场景: 存储过程适用于业务逻辑复杂且不会经常变更、请求量较少的操作。如:后台大批量查询、更新日志等。 * 比较复杂、耗时的操作 * 涉及多个SQL语句或者涉及多张表的操作 > 存储过程实例: ``` mysql > DELIMITER // //mysql 声明语句结束符,可以自定义。 mysql > CREATE PROCEDURE proc2(IN parameter int) //创建存储过程,名称为proc2,并传参 -> begin //存储过程开始 -> declare var int; //变量定义 -> set var=parameter+1; -> if var=0 then -> insert into t values(17); -> end if; -> if parameter=0 then -> update t set s1=s1+1; -> else -> update t set s1=s1+2; -> end if; -> end; //存储过程结束 -> // //mysql 语句结束符,上面定义的一致 mysql > DELIMITER ; //将语句的结束符号恢复为分号 ```