何为储存过程?
存储过程是一组为了完成特定功能的 SQL
语句集合。MySQL 5.0
终于开始已经支持存储过程,它是数据库中最重要的功能,
目的:将常用或复杂的工作预先用
SQL
语句写好并用一个指定名称存储起来,这个过程经编译和优化后存储在数据库服务器中,因此称为存储过程。
通俗的说,他就是MySQL
中的“方法”,和Java等语言方法概念是差不多的。
优势
- 封装性
存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的 SQL 语句,并且数据库专业人员可以随时对存储过程进行修改,而不会影响到调用它的应用程序源代码。
- 可增强
SQL
语句的功能和灵活性
存储过程可以用流程控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
- 可减少网络流量
由于存储过程是在服务器端运行的,且执行速度快,因此当客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而可降低网络负载。
- 高性能
存储过程执行一次后,产生的二进制代码就驻留在缓冲区,在以后的调用中,只需要从缓冲区中执行二进制代码即可,从而提高了系统的效率和性能。
- 提高数据库的安全性和数据的完整性
使用存储过程可以完成所有数据库操作,并且可以通过编程的方式控制数据库信息访问的权限。
创建储存过程
语法:
CREATE PROCEDURE 过程名称([proc_parameter[,...]]) [characteristic ...] routine_body
注:
proc_parameter
:表示[ IN | OUT | INOUT ] param_name type
上面的语法有些许看不懂,我直接写一个吧。
DELIMITER // CREATE PROCEDURE proc1(OUT s int) BEGIN SELECT COUNT(*) INTO s FROM user; END // DELIMITER ;
注:DELIMITER用于更改结尾符号,
//
也可以使用$$
替换,只是为了更改默认的断句符号;
。
DELIMITER 分隔符 CREATE PROCEDURE 储存过程名称(IN|OUT|INOUT) BEGIN -- SQL语句 END 分隔符 DELIMITER ;
IN 输入参数:表示调用者向过程传入值
OUT 输出参数:表示过程向调用者传出值
INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值
你可以理解为,IN
是从控制台输入参数,OUT
相当于输出参数,如同Return
。
这里我就不多说了,自己摸索,然后附上一张知乎上面的演示图。
创建变量
DECLARE局部变量
DECLARE var_name[,...] type [DEFAULT value]
这个语句被用来声明局部变量。
要给变量提供一个默认值,请包含一个DEFAULT子句。值可以被指定为一个表达式,不需要为一个常数。如果没有DEFAULT子句,初始值为NULL。 局部变量的作用范围在它被声明的BEGIN ... END块内。它可以被用在嵌套的块中,除了那些用相同名字声明变量的块。
变量SET语句
SET var_name = expr [, var_name = expr]
在存储程序中的SET语句是一般SET语句的扩展版本。
被参考变量可能是子程序内声明的变量,或者是全局服务器变量。 在存储程序中的SET语句作为预先存在的SET语法的一部分来实现。这允许SET a=x, b=y, ...这样的扩展语法。其中不同的变量类型(局域声明变量及全局和集体变量)可以被混合起来。这也允许把局部变量和一些只对系统变量有意义的选项合并起来。
SELECT ... INTO 语句
SELECT col_name[,...] INTO var_name[,...] table_expr
这个SELECT语法把选定的列直接存储到变量。因此,只有单一的行可以被取回。 SELECT id,data INTO x,y FROM test.t1 LIMIT 1;
调用储存过程
CALL 储存过程名(带入的参数)
查看储存过程
-- 查看储存过程状态 SHOW PROCEDURE STATUS; -- 查看某一数据库的存储过程状态 SHOW PROCEDURE STATUS WHERE DB = '数据库名'; -- 查看储存过程的创建代码 SHOW CREATE PROCEDURE 储存过程名;
修改储存过程
ALTER PROCEDURE 储存过程名 [特性....]; -- 注意:只能修改属性,不能修改内容
删除存储过程
DROP PROCEDURE 储存过程名; -- 删除前建议用IF EXISTS判断是否存在
如果你MySQL已经学到这里,那相比也能直接通过许多语法解释或者教学文章快速摸索出一二了,所以我也不像对于MySQL很罗嗦,就不会去怎么详细的说明了。
学到一定程度,观看文章文档学习效率>观看视频。