MySQL数据库高级篇之储存过程

何为储存过程?

存储过程是一组为了完成特定功能的 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很罗嗦,就不会去怎么详细的说明了。

学到一定程度,观看文章文档学习效率>观看视频。

posted @ 2022-05-11 16:17  JanYork(小简)  阅读(43)  评论(0编辑  收藏  举报