MySQL_存储过程

版权声明:由于作者水平有限,文中难免有误,欢迎各位业界同仁斧正! https://blog.csdn.net/UserPython/article/details/82997965

存储过程的介绍

  • 存储过程是SQL语句和流程控制语句的预编集合,并以一个名称存储并作为一个单元进行处理
  • 单一的存储过程效率比单一的SQL语句高,因为存储过程进行了预编译,而SQL语句要进行语法分析

变量的应用

MySQL存储过程中的参数主要有局部参数和会话参数两种,这两种又可以被称为局部变量和会话变量。局部变量只在定义该局部变量的begin…end范围内有效,会话变量在整个存储过程范围内均有效

局部变量

  • 局部变量以关键字DECLARE声明,后跟变量名和变量类型

DECLARE var_name [, varname2, varname3 …] date_type [DEFAULT value];
例:DECARE num INT DEFAULE 10;

在这里插入图片描述

在该例中,分别在内层和外层BEGIN…END块中都定义同名的变量x,按照语句从上到下执行的顺序,如果变量x在整个程序中都有效,则最终结果应该都为inner,但真正的输出结果却不同,这说明在内部BEGIN…END块中定义的变量只在该块内有效

全局变量/会话变量

  • MySQL中的会话变量不必声明既可以使用,会话变量在整个过程中有效,会话变量名以字符“@”作为起始字符

在这里插入图片描述

分别在内部和外部BEGIN…END块中都定义了同名的会话变量@t,并且最终输出结果相同,从而说明会话变量的作用范围为整个程序

为变量赋值

  • 定义变量后,通过赋值可以改变变量的默认值
  • 两种赋值方式:

SET var_name = expr [, var_name = expr, …];

例:SET num = 100;

SELECT col_name [, … ] INTO var_name [, … ] table_expr;

例:SELECT store INTO num from bookinfo;//将查询结果赋值给变量

在这里插入图片描述
上述赋值语句必须存在于创建的存储过程中,且需将赋值语句放置在BEGIN…END之间。若脱离此范围,该变量将不能使用或被赋值

创建存储过程和使用存储过程

存储过程的语法结构:

CREATE PROCEDURE proc_name([proc_parameter[ … ]])
[characteristic … ] routine_body

  • proc_name : 存储过程的名称
  • proc_parameter : 指定存储过程参数列表形式如:
  • proc_parameter中的参数由3部分组成,它们分别是输入输出型、参数名称和参数类型。其中形式为**[IN | OUT |INOUT] param_name type**。其中,IN:输入参数,表示该参数的值必须在调用存储过程时指定;OUT:输出参数,表示该参数的值可以被存储过程改变,并且可以返回;INOUT:既可以输入也可以输出,表示该参数的调用时指定,并且可以被改变和返回;param_name参数时存储过程参数名称;type表示指定存储过程的参数类型,该类型可以为MySQL数据库的任意数据类型。
  • characteristic :参数指定存储过程的特性
  • routine_body : 过程体     过程体由合法的SQL语句构成;过程体可以是任意SQL语句;过程体如果为复合结构则使用BEGIN…END语句;复合结构可以包含声明,流程控制语句;
  • MySQL存储过程名称不区分大小写
  • MySQL语句默认的结束符为分号“;”,而且存储过程和函数内的SQL语句需要分号来结束。为了避免冲突,首先用“delimiter //” 将MySQL的结束符设置为//,最后再用“delimiter ;” 来将结束符恢复成分号。更改结束标识可以用关键字delimiter定义

调用存储过程

CALL proc_name([parameter [, …]])
CALL proc_name[()];

创建无参的存储过程
需求:创建查询图书编号、书名、图书类别的存储过程

在这里插入图片描述

创建带有输入参数和输出参数的存储过程
需求:设计一个存储过程,删除一个读者,并输出剩余读者的个数

在这里插入图片描述

创建带有输入输出参数的存储过程
需求:设计一个存储过程,实现交换两个数的处理*

在这里插入图片描述

删除存储过程

  • 语法结构

DROP PROCEDURE [IF EXISTS] proc_name;

创建复合结构的存储过程

使用条件判断语句的存储过程
需求:设计比较两个数大小的存储过程
在这里插入图片描述

在这里插入图片描述

使用循环控制语句的存储过程
需求:设计一个存储过程,向数据表插入100条数据的存储过程

在这里插入图片描述

存储过程与函数的区别

功能上的区别

  • 存储过程:一般来说,存储过程实现的功能要复杂一点。功能强大,可以执行包括修改表等一系列数据库操作
  • 存储函数:实现的功能针对性比较强

返回值上的不同

  • 存储过程:可以返回多个值,也可以不返回值,只是实现某种效果或工作
  • 存储函数:必须有返回值,而且只能有一个返回值

参数的不同

  • 存储过程:存储过程的参数类型有三种:IN、OUT、INOUT
  • 存储函数:参数类型只有一种,类似于IN参数。调用函数时需要按照参数的类型指定值即可

语法结构上的不同

  • 存储过程:存储过程声明时不需要指定返回类型
  • 存储函数:函数声明时需要指定返回类型,且在函数体中必须包含一个有效的RETURN语句

调用方式上的不同

  • 存储过程:一般是作为一个独立的部分来执行,用CALL语句进行调用
  • 存储函数:嵌入在SQL中使用,可以在select中调用

猜你喜欢

转载自blog.csdn.net/UserPython/article/details/82997965
今日推荐