数据表的存储过程和函数介绍

news/2025/2/23 18:08:59

文章目录

    • 一、概述
    • 二、创建存储过程
    • 三、在创建过程中使用变量
    • 四、光标的使用
    • 五、流程控制的使用
    • 六、查看和删除存储过程

一、概述

存储过程和函数是在数据库中定义的一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句。存储过程和函数可以避免开发人员重复编写相同的SQL语句。而且。存储过程和函数是在MySQL服务器中存储和执行的。可以减少客户端和服务端的数据传输。

二、创建存储过程

创建存储过程和函数是指将经常使用的一组SQL语句组合在一起,并将这些SQL语句当作一个整体存储在MySQL服务器中。存储程序可以分为存储过程和函数。在MySQL中创建存储过程使用的语句CREATE PROCEDURE。其语法形式如下:

CREATE PROCEDURE procedure_name([proc_param[,...]]) routine_body

在上述语句中,参数procedure_name表示要创建的存储过程名字,参数proc_param表示存储过程的参数,参数routine_body表示存储过程的SQL语句代码,可以使用BEGIN…END来标志SQL语句的开始和结束。
**注意:**在具体创建存储过程时,存储过程名不能与已经存在的存储过程名重名。

proc_param中每个参数的语法形式如下:
在上述语句中,每个参数由三部分组成,分别为输入/输出类型、参数名和参数类型。其中,输入/输出类型有三种类型,分别为IN(表示输入类型)、OUT(表示输出类型)、INOUT(表示输入/输出类型)。param_name表示参数名;type表示参数类型,可以是MySQL软件所支持的任意一个数据类型。

三、在创建过程中使用变量

在存储过程和函数中,可以定义和使用变量。用户可以使用关键字DECLARE来定义变量。然后为变量赋值。这些变量的作用范围是在BEGIN…END程序段中。

1.定义变量
在MySQL中,可以使用DECLARE关键字来定义变量。定义变量的基本语法如下:

DECLARE var_name[,...] type [DEFAULT value]

其中关键字DECLARE是用来声明变量的;参数var_name是变量的名称,可以同时定义多个变量;参数type用来指定变量的类型;DEFAULT value子句将变量默认值设置为value,没有使用DEFAULT子句时,默认值为NULL。
定义变量cid,数据类型为INT类型,默认值为10,代码如下:

DECLARE cid INT DEFAULT 10;

2.为变量赋值
在MySQL中可以使用关键字SET来为变量赋值,SET语句的基本语法如下:

SET var_name=expr[,var_name=expr]...

其中,关键字SET用来为变量赋值;参数var_name是变量的名称;参数expr是赋值表达式。一个SET语句可以同时为多个变量赋值。各个变量的赋值语句之间用逗号隔开。
例如,将变量tmp_id赋值为88,代码如下:

SET tmp_id = 88;

在MySQL中,还可以使用SELECT…INFO语句为变量赋值。其基本语法如下:

SELECT col_name[,...] INFO var_name[,...] FROM table_name WHERE condition

其中,参数col_name表示查询的字段名称;参数var_name是变量的名称;参数table_name指表的名称;参数condition指查询条件。
在这里插入图片描述

四、光标的使用

查询语句可能查询出多条记录,在存储过程和函数中使用光标来逐条读取查询结果集中的记录。光标的使用包括声明光标、打开光标、使用光标和关闭光标。光标必须声明在处理程序之前,并且声明在变量和条件之后。

1.声明光标
在MySQL中,可以使用DECLARE关键字来声明光标,其基本语法如下:

DECLARE cursor_name CURSOR FOR select_statement;

其中参数cursor_name表示光标的名称;参数select_statement表示SELECT语句的内容。

2.打开光标
在MySQL中,使用关键字OPEN来打开光标,其基本语法如下:

OPEN cursor_name;

其中,参数cursor_name表示光标的名称。

3.使用光标
在MySQL中,使用关键字FETCH来使用光标,其基本语法如下:

FETCH cursor_name INTO var_name [,var_name...];

其中参数cursor_name表示光标的名称;参数var_name表示将光标中的SELECT语句查询出来的信息存入该参数中。var_name必须在声明光标之前定义好。

4.光标光标
在MySQL中,使用关键字CLOSE来关闭光标,其基本语法如下:

CLOSE cursor_name;

其中参数cursor_name表示光标的名称。
在这里插入图片描述
在这里插入图片描述

五、流程控制的使用

在存储过程和函数中,可以使用流程来控制语句的执行,在MySQL中,可以使用IF语句、CASE语句、LOOP语句、LEAVE语句,ITERATE语句、REPEAT语句和WHILE语句来进行流程控制。

1.IF语句
IF语句用来进行条件判断。根据条件执行不同的语句,其语法的基本形式如下:

IF search_condition THEN statement_list 
[ELSEIF search_condition THEN statement_list] 
...
[ELSE statement_list] END IF

参数search_condition表示条件判断语句;参数statement_list表示不同条件的执行语句。

下面是一个IF语句的示例,代码如下:

IF age > 20 THEN SET @count1 = @count1 + 1;
   ELSEIF age = 20 THEN @count2 = @count2 + 1;
   ELSE @count3 = @count3 + 1;
END IF;

该示例根据age与20的大小关系来执行不同的SET语句。如果age值大于20,将count1的值加1;如果age值等于20,就将count2的值加1;其他情况将count3的值加1。IF语句都需要使用END IF来结束。
在这里插入图片描述
2.CASE语句
CASE语句可实现比IF语句更复杂的条件判断,其语法的基本形式如下:

CASE case_value
WHEN when_value THEN statement_list 
[WHEN when_value THEN statement_list] 
[ELSE statement_list]
END CASE

其中,参数case_value表示条件判断的变量;参数when_value表示变量的取值;参数statement_list表示不同的when_value值的执行语句。

下面是一个CASE语句的示例。代码如下:

CASE level
	WHEN 20 THEN SET attack = attack + 5;
	WHEN 30 THEN SET attack = attack + 10;
	WHEN 40 THEN SET attack = attack + 15;
	ELSE SET attack = attack + 1;
END CASE

当级别level值为20时,attack值加5;当级别level值为30时,attack值加10;当级别level值为40时。attack值加15;否则attack + 1。CASE语句使用END CASE结束。

3.LOOP语句
LOOP语句可以使某些特定的语句重复执行,实现一个简单的循环。LOOP语句本身没有停止循环,只有遇到LEAVE语句等才能停止循环。LOOP语句的语法形式如下:

[begin_label:] LOOP
statement_list
END LOOP [end_label]

其中,参数begin_label和参数end_label分别表示循环开始和结束的标志,这两个标志必须相同。而且都可以省略;参数statemeng_list表示需要循环执行的语句。

下面是一个LOOP语句的示例,代码如下:

ADD_num:LOOP
	SET @count = @count + 1;
END LOOP add_num;

该示例循环执行count加1的操作。因为没有跳出循环,这个循环成了一个死循环。LOOP循环都以END LOOP结束。

4.LEAVE语句
LEAVE语句主要用于跳出循环控制,其语法形式如下:

LEAVE label

其中,参数label表示循环的标志。

下面是一个LEAVE语句的示例,代码如下:

add_num:LOOP
	SET @count = @count + 1IF @count = 100  THEN
		LEAVE add_num;
	END IF;
END LOOP add_num;

该示例循环执行count值加1的操作。当count的值等于100时,LEAVE语句跳出循环。
在这里插入图片描述
5.ITERATE语句
ITERATE语句也是用来跳出循环的语句,但是ITERATE语句是跳出本次循环,然后直接进入下一次循环,ITERATE语句的语法形式如下:

ITERATE label

其中,参数label表示循环的标志。

下面是一个ITERATE语句的示例,代码如下:

add_num:LOOP
	set @count = @count +1;
	IF @count = 100 THEN
		 LEAVE add_num;
    ELSE IF MOD(@count, 3) = 0 then
    	ITERATE add_num;
    select * from student;
END LOOP add_num;

该示例循环执行count加1的操作,count的值为100时结束循环,如果count的值能够整除3,就跳出本次循环,不再执行下面的SELECT语句。

6.REPEAT语句
REPEAT语句是有条件控制的循环语句,当满足特定条件时,就会跳出循环语句。REPEAT语句的基本语法形式如下:

[begin_label:] REPEAT
	UNTIL search_condition
 END REPEAT [end_label]

其中,参数statement_list表示循环的执行语句;参数search_condition表示结束循环的条件,满足该条件时循环结束。

下面是一个REPEAT语句的示例,代码如下:

REPEAT
   SET @count=@count+1;
   UNTIL @count=100
END REPEAT;

该示例循环执行count加1的操作,count值为100时结束循环。REPEAT循环都用END REPEAT结束。

7.WHILE语句
WHILE语句也是有条件控制的循环语句,但WHILE语句和REPEAT语句是不一样的。WHILE语句是当满足条件时执行循环内的语句。WHILE语句的基本语法形式如下:

[begin_label:] WHILE search_condition DO
	statement_list
END WHILE [end_label]

其中,参数statement_condition表示循环执行的条件,满足该条件时循环执行;参数statement_list表示循环的执行语句。

下面是一个WHILE语句的示例。代码如下:

WHILE @count<100 DO
	SET @count = @count + 1;
END WHILE;

六、查看和删除存储过程

存储过程创建以后,用户可以通过SHOW STATUS语句来查看存储过程的状态,也可以通过SHOW CREATE语句来查看存储过程的定义。用户也可以通过查询information_schema数据库下的Routines表来查看存储过程的信息。

1.SHOW STATUS语句查看存储过程
在MySQL中,可以通过SHOW STATUS语句查看存储过程的状态。其基本语法形式如下:

SHOW PROCEDURE STATUS [like 'pattern'];

其中,参数PROCEDURE表示查询存储过程;参数LIKE 'pattern’用来匹配存储过程的名称。

2.SHOW CREATE语句查看存储过程的定义
在MySQL中,可以通过SHOW CREATE 语句查看存储过程的状态,语法形式如下:

SHOW CREATE PROCEDURE proc_name

其中,参数PROCEDURE表示查询存储过程;参数proc_name表示存储过程的名称。

3.information_schema.Routine表中查看存储过程的信息
存储过程和函数的信息存储在information_schema数据库下的Routines表中。可以通过查询该表的记录来查询存储过程和函数的信息。其基本语法形式如下:

SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME = 'proc_name';

其中,字段ROUTINE_NAME中存储的是存储过程和函数的列名称;参数proc_name表示存储过程或函数的名称。

4.存储过程的删除
在MySQL中删除存储过程通过SQL语句DROP完成:

DROP PROCEDURE proc_name;

在上述语句中,关键字DROP PROCEDURE用来实现删除存储过程,参数proc_name表示所要删除的存储过程名称。


http://www.niftyadmin.cn/n/5863654.html

相关文章

周末总结(2024/02/22)

工作 人际关系核心实践&#xff1a; 要学会随时回应别人的善意&#xff0c;执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己&#xff0c;抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内&#xff0c;职场社交不要放在5min以外 职场的人际关系在面对利…

Java IO 和 NIO 的基本概念和 API

一、 Java IO (Blocking IO) 基本概念&#xff1a; Java IO 是 Java 平台提供的用于进行输入和输出操作的 API。Java IO 基于 流 (Stream) 的模型&#xff0c;数据像水流一样从一个地方流向另一个地方。Java IO 主要是 阻塞式 I/O (Blocking I/O)&#xff0c;即线程在执行 I/O …

牛客练习赛134 —— B题 python 补题 + 题解

牛客练习赛134 B 题目描述 示例输入&#xff1a; 1 5 1 2 4 5 6 2 5 4 6 9示例输出&#xff1a; 32解题思路&#xff1a; 题目大意 给定一个2行n列的矩阵&#xff0c;允许交换两列一次&#xff0c;从左上角(1,1)走到右下角(2,n)&#xff0c;每一步只能向右或向下移动&#x…

RT-Thread+STM32L475VET6——icm20608传感器

文章目录 前言一、板载资源二、具体步骤1.打开CubeMX进行配置1.1 使用外部高速时钟&#xff0c;并修改时钟树1.2 打开I2C3&#xff0c;参数默认即可(I2C根据自己需求调整&#xff09;1.3 打开串口1.4 生成工程 2. 添加icm20608软件包3. 使能传感器&#xff0c;打开动态链接库4.…

力扣LeetCode: 2506 统计相似字符串对的数目

题目&#xff1a; 给你一个下标从 0 开始的字符串数组 words 。 如果两个字符串由相同的字符组成&#xff0c;则认为这两个字符串 相似 。 例如&#xff0c;"abca" 和 "cba" 相似&#xff0c;因为它们都由字符 a、b、c 组成。然而&#xff0c;"aba…

计算机网络面试知识点总结

目录 1. 计算机网络的基本知识点2. OSI 七层模型3. TCP/IP 四层模型4. TCP 和 UDP4.1 TCP 协议4.2 TCP 流量控制4.3 TCP 拥塞控制4.4 TCP 三次握手4.5 TCP 四次挥手4.6 TCP 粘包问题4.7 TCP Socket交互流程4.8 UDP 协议以及和 TCP 协议的不同 5. HTTP协议5.1 HTTP 请求方法以及…

力扣-贪心-53 最大子数组和

思路 先把每一个值都加到当前集合中&#xff0c;记录当前的和&#xff0c;直到当前记录和小于0了&#xff0c;再重置改记录&#xff0c;再次尝试累加 代码 class Solution { public:int maxSubArray(vector<int>& nums) {int res INT32_MIN;int curSum 0;for(in…

ES6 新特性,优势和用法?

ES6 新特性&#xff0c;优势和用法&#xff1f; ES6&#xff08;ECMAScript 2015&#xff09;引入了许多新特性&#xff0c;这些特性让 JavaScript 变得更加强大、简洁和易于使用。下面为你详细介绍一些常见的 ES6 新特性、它们的优势以及用法。 1. 块级作用域&#xff1a;le…