前面学习的 MySQL 相关知识都是针对一个表或几个表的单条 SQL 语句,使用这样的SQL 语句虽然可以完成用户的需求,但在实际的数据库应用中,有些数据库操作可能会非常复杂,可能会需要多条 SQL 语句一起去处理才能够完成,这时候就可以使用存储过程, 轻松而高效的去完成这个需求,有点类似shell脚本里的函数
(1)存储过程是一组为了完成特定功能的SQL语句集合。 两个点 第一 触发器(定时任务) 第二个判断
(2)存储过程这个功能是从5.0版本才开始支持的,它可以加快数据库的处理速度,增强数据库在实际应用中的灵活性。存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它即可。操作数据库的传统 SQL 语句在执行时需要先编译,然后再去执行,跟存储过程一对比,明显存储过程在执行上速度更快,效率更高
(3)存储过程在数据库中L 创建并保存,它不仅仅是 SQ语句的集合,还可以加入一些特殊的控制结构,也可以控制数据的访问方式。存储过程的应用范围很广,例如封装特定的功能、 在不同的应用程序或平台上执行相同的函数等等。
(1)执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率
(2)SQL语句加上控制语句的集合,灵活性高
(3)在服务器端存储,客户端调用时,降低网络负载
(4)可多次重复被调用,可随时修改,不影响客户端调用
(5)可完成所有的数据库操作,也可控制数据库的信息访问权限
CREATE PROCEDURE <过程名> ( [过程参数[,…] ] ) <过程体> [过程参数[,…] ]
(1)创建存储过程:
use exo;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> delimiter @@ #将语句的结束符号从分号;临时改为两个@@(可以自定义)
mysql> create procedure proc () #创建存储过程,过程名为proc,不带参数
-> begin #过程体以关键字 BEGIN 开始
-> create table kai(id int(10),name char(10),score int(10));
-> insert into kai values(1,'wang',13);
-> select * from kai;
-> end @@ #过程体以关键字 END 结束
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ; #将语句的结束符号恢复为分号
(2)调用存储过程:
mysql> call proc ();
+------+------+-------+
| id | name | score |
+------+------+-------+
| 1 | wang | 13 |
+------+------+-------+
1 row in set (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
1.存储过程的主体都分,被称为过程体
2.以BEGIN开始,以END结束,若只有一条sQL语句,则可以省略BEGIN-END
3.以DELIMITER开始和结束
delimiter 是用户自定义的结束符
省略存储过程其他步骤
mysql>delimiter ; 分号前有空格
(3)查看存储过程:
格式:
SHOW CREATE PROCEDURE [数据库.]存储过程名; #查看某个存储过程的具体信息
show create procedure proc\G
*************************** 1. row ***************************
Procedure: proc
sql_mode: PIPES_AS_CONCAT,ANSI_QUOTES,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Create Procedure: CREATE DEFINER="root"@"localhost" PROCEDURE "proc"()
begin
create table kai(id int(10),name char(10),score int(10));
insert into kai values(1,'wang',13);
select * from kai;
end
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
1 row in set (0.00 sec)
(1)IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
(2)OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
(3)INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
delimiter @@
mysql> create procedure proc1 (in inname varchar(40)) #行参
-> begin
-> select * from info where name=inname;
-> end @@
mysql> delimiter ;
call proc1('billkin');
+------+---------+-------+----------+--------+------+
| id | name | score | address | hobbid | addr |
+------+---------+-------+----------+--------+------+
| 3 | billkin | 60.00 | shanghai | 4 | chen |
+------+---------+-------+----------+--------+------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
ALTER PROCEDURE <过程名>[<特征>... ]
ALTER PROCEDURE GetRole MODIFIES SQL DATA SQL SECURITY INVOKER;
MODIFIES sQLDATA:表明子程序包含写数据的语句
SECURITY:安全等级
invoker:当定义为INVOKER时,只要执行者有执行权限,就可以成功执行。
(1)概念:存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。
(2)语法:
DROP PROCEDURE IF EXISTS Proc;
drop procedure if exists proc;
Query OK, 0 rows affected (0.01 sec)
mysql> drop procedure if exists proc1;
Query OK, 0 rows affected (0.00 sec)
存储过程的作用有以下几个方面:
MySQL 存储过程封装了常见的业务逻辑和数据处理逻辑,能够减少客户端和服务器之间的通信量和频率,从而提高了应用程序的性能,并减少了对网络连接的依赖。同时,MySQL 存储过程还可以在服务器端执行操作,保护敏感数据,提高数据库的安全性。
可以在存储过程中编写相对独立的代码单元,并将其保存到 MySQL 数据库中,这些代码单元可以供多个应用程序或客户端调用,从而提高了代码的重用性,减少了代码的冗余,简化了应用程序的开发和维护。
将业务逻辑和数据处理逻辑封装到存储过程中,使得应用程序和数据库之间的耦合度更低,使得程序更加易于扩展和维护。
存储过程可以更加方便的实现错误处理和事务控制,避免了在应用程序中处理复杂的错误情况和事务回滚操作。在存储过程中可以编写相应的错误处理程序,减轻了程序开发工作量。
综上所述,MySQL 存储过程在提高性能、提高数据安全性、代码重用性、降低耦合度等方面具有重要意义,是 MySQL 数据库管理中的一项重要技术