MySQL数据库存储过程介绍

目录

一、存储过程

1. 概述

2. 存储过程的优点

3. 语法格式

3.1 创建存储过程

3.2 调用存储过程 

3.3 查看存储过程 

3.4 显示状态信息 

3.5 查看指定存储过程信息 

3.6 删除存储过程  

二、传参

1. 输入参数 in

2. 输出参数 out

3. 输入输出参数 inout


一、存储过程

1. 概述

MySQL 存储过程是一组为了完成特定任务而预先编译并存储在数据库中的 SQL 语句集合。这些存储过程可以被多次调用,有点类似shell脚本里的函数,从而简化重复性任务的执行,并提高数据库的性能和安全性。有两个重要工具:触发器(定时任务)和判断。

2. 存储过程的优点

① 执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率

② SQL语句加上控制语句的集合,灵活性高

③ 在服务器端存储,客户端调用时,降低网络负载

④ 可多次重复被调用,可随时修改,不影响客户端调用

⑤ 可完成所有的数据库操作,也可控制数据库的信息访问权限

3. 语法格式

3.1 创建存储过程

创建格式:

delimiter $$    # 更改语句结束符号因为存储过程可能包含多个 SQL 语句,需要使用不同于分号的结束符。这里将结束符更改为 &&,也可以用 // @@ 
create procedure 存储过程名(可选参数)   # 创建一个新的存储过程,可选的参数列表,用括号括起来,可以接受零个或多个输入参数
-> begin                          # 过程体以关键字 BEGIN 开始
-> ……                             # 可选,包括了存储过程的特性,例如安全性、权限等设置
-> …… <过程体语句>                 # 包含了实际的存储过程代码,可以包括各种 SQL 语句、条件判断和循环等
-> end $$						 # 过程体以关键字 end 结束
delimiter ;						 # 将语句的结束符号恢复为分号,以便继续执行其他 SQL 语句,分号前面有空格

 示例:

mysql> delimiter $$
mysql> create procedure name1()-> begin-> create table stu1 (id int(5),name char(15),score decimal(4,2));-> insert into stu1 values (1,'zhao',90.5);-> select * from stu1;-> end $$
Query OK, 0 rows affected (0.01 sec)mysql> delimiter ;

3.2 调用存储过程 

在 MySQL 中,存储过程不会自动执行,除非显式地调用。一旦创建了存储过程,它将保留在数据库中,但不会自动执行或生效。只有在明确调用存储过程时,其中的代码才会被执行。您可以通过使用 call 语句来调用存储过程。

格式:
mysql> call 存储过程名();
示例:
mysql> call name1();
+------+------+-------+
| id   | name | score |
+------+------+-------+
|    1 | zhao | 90.50 |
+------+------+-------+
1 row in set (0.05 sec)

3.3 查看存储过程 

格式:
show create procedure [数据库.]存储过程名;		#查看某个存储过程的具体信息
示例:
mysql> mysql> show create procedure school.name1;
+-----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| Procedure | sql_mode                                                                                                                                                                 | Create Procedure                                                                                                                                                                             | character_set_client | collation_connection | Database Collation |
+-----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| name1     | 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 DEFINER="root"@"localhost" PROCEDURE "name1"()
begin
create table stu1 (id int(5),name char(15),score decimal(4,2));
insert into stu1 values (1,'zhao',90.5);
select * from stu1;
end | utf8                 | utf8_general_ci      | utf8_general_ci    |
+-----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+

3.4 显示状态信息 

mysql> show procedure status;

3.5 查看指定存储过程信息 

mysql> show procedure status like '%name1%'\G;
*************************** 1. row ***************************Db: schoolName: name1Type: PROCEDUREDefiner: root@localhostModified: 2024-03-27 18:58:42Created: 2024-03-27 18:58:42Security_type: DEFINERComment: 
character_set_client: utf8
collation_connection: utf8_general_ciDatabase Collation: utf8_general_ci
1 row in set (0.00 sec)

3.6 删除存储过程  

drop procedure [if exists] 存储过程名;

二、传参

在 MySQL 中,存储过程可以接受参数,这使得存储过程更加灵活和通用。存储过程的参数可以分为输入参数、输出参数和输入输出参数三种类型。在创建存储过程时,可以定义这些参数,并在存储过程的调用中传递相应的参数值。参数可以是任何数据类型,如整数、字符串、日期等。

1. 输入参数 in

输入参数是存储过程接受的值,但存储过程在执行完毕后不会改变这些参数的值。输入参数允许向存储过程传递数据以供处理。表示调用者向过程传入值(传入值可以是字面量或变量)。

mysql> delimiter $$
mysql> create procedure name2(in inname varchar(40))-> begin-> select * from student where name=inname;-> end $$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> select * from student;
+----+---------+----------+------+-------+
| id | name    | address  | age  | score |
+----+---------+----------+------+-------+
|  1 | zhangs  | nanjin   | 10   |  90.5 |
|  2 | lisi    | nanjin   | 15   |  65.0 |
|  3 | wangwu  | beijin   | 30   |  50.0 |
|  4 | zhaoliu | shanghai | 30   |  50.0 |
|  5 | zhouqi  | hangzhou | 40   |  55.0 |
+----+---------+----------+------+-------+
mysql> call name2('lisi');
+----+------+---------+------+-------+
| id | name | address | age  | score |
+----+------+---------+------+-------+
|  2 | lisi | nanjin  | 15   |  65.0 |
+----+------+---------+------+-------+

2. 输出参数 out

输出参数是存储过程在执行过程中会修改其值,并在存储过程执行完毕后将这些值传递回调用者。输出参数通常用于返回存储过程执行结果或特定计算的结果。表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)。

mysql> delimiter $$
mysql> create procedure name3(out outname varchar(40))-> begin-> select count(*) into outname from student; # 查询student表中的总行数,并将结果存储在输出参数outname中-> end $$
Query OK, 0 rows affected (0.00 sec)mysql> delimiter ;
mysql> call name2(@outname); # 调用该存储过程时,传入一个变量@outname来接收查询结果
mysql> select @outname;
+----------+
| @outname |
+----------+
| 5        |
+----------+
# 创建一个名为 name3 的存储过程,该存储过程接受一个输出参数 outname,并从 student 表中获取行数并将结果存储在 outname 中。调用 name3 存储过程。执行 SELECT 语句,查看存储过程中设置的输出变量的值

3. 输入输出参数 inout

输入输出参数既允许传递数据给存储过程,又在存储过程执行过程中可以修改其值,并将修改后的值传递回调用者。既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)。

mysql> delimiter $$
mysql> create procedure name4(in student_name varchar(40),out student_score varchar(40))-> begin-> select score into student_score from student where name=student_name;  # 从student表查询学生的分数,并将结果存储在输出参数中。-> end $$
Query OK, 0 rows affected (0.00 sec)mysql> delimiter ;
mysql> call name4('zhangs',@score);
Query OK, 1 row affected (0.00 sec)
mysql> select @score;
+--------+
| @score |
+--------+
| 90.5   |
+--------+
# in 用于指定输入参数 student_name,它接受一个学生姓名作为输入
# out 用于指定输出参数 student_score,存储过程将查询到的学生分数存储在这个输出参数中
# 名为 name4 的存储过程,该存储过程接受学生的姓名作为输入参数,并根据学生姓名查询其成绩,并将结果存储在输出参数中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/775549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【GitLab】Ubuntu 22.04 快速安装 GitLab

在 Ubuntu 22.04 上安装最新版本的 GitLab&#xff0c;可以按照以下步骤操作&#xff1a; 1. 更新系统&#xff1a; 在终端中执行以下命令以确保系统是最新的&#xff1a; sudo apt update sudo apt upgrade2. 安装依赖&#xff1a; 安装 GitLab 所需的依赖包&#xff1a; …

【系统架构师】-第13章-层次式架构设计

层次式体系结构设计是将系统组成一个层次结构&#xff0c;每一层 为上层服务 &#xff0c;并作为下层客户。 在一些层次系统中&#xff0c;除了一些精心挑选的输出函数外&#xff0c; 内部的层接口只对相邻的层可见 。 连接件通过决定层间如何交互的协议来定义&#xff0c;拓扑…

kubernetes负载均衡资源-Ingress

一、Ingress概念 1.1 Ingress概念 使用NodePort类型的Service可以将集群内部服务暴露给集群外部客广端,但使用这种类型Service存在如下几个问题。 1、一个端口只能一个服务使用,所有通过NodePort暴露的端口都需要提前规划;2、如果通过NodePort暴露端口过多,后期维护成本太…

开源AI引擎:文本自动分类在公安及消防执法办案自动化中的应用

一、实际案例介绍 通过文本分类算法自动化处理文本数据&#xff0c;快速识别案件性质和关键特征&#xff0c;极大地提高了案件管理和分派的效率。本文将探讨这两种技术如何帮助执法机构优化资源分配&#xff0c;确保案件得到及时而恰当的处理&#xff0c;并增强公共安全管理的…

如何在openGauss中使用zhparser

如何在 openGauss 中使用 zhparser 准备 一个装有 openGauss 数据库的环境下载 scws 代码到任意位置: https://github.com/hightman/scws master下载 zhparser 代码到任意位置: GitHub - amutu/zhparser: zhparser is a PostgreSQL extension for full-text search of Chines…

SpringBoot集成WebSocket实现简单的多人聊天室

上代码—gitee下载地址&#xff1a; https://gitee.com/bestwater/Spring-websocket.git下载代码&#xff0c;连上数据库执行SQL&#xff0c;就可以运行&#xff0c;最终效果

Redis中的客户端(二)

客户端 输入缓冲区。 客户端状态的输入缓冲区用于保存客户端发送的命令请求: typedef struct redisClient {// ...sds querybuf;// ... }redisClient;例子 举个例子&#xff0c;如果客户端向服务器发送了以下命令请求: SET key value那么客户端状态的qureybuf属性将是一个…

C语言和C++实现栈Stack的对比,有什么区别?

C语言和C实现Stack的对比,我们分别看看C语言实现的栈和c实现的栈有什么区别 C语言实现 typedef int DataType; typedef struct Stack {DataType* array;int capacity;int size; }Stack; void StackInit(Stack* ps) {assert(ps);ps->array (DataType*)malloc(sizeof(DataTyp…

LNMP架构之mysql数据库实战

mysql安装 到官网www.mysql.com下载源码版本 实验室使用5.7.40版本 tar xf mysql-boost-5.7.40.tar.gz #解压 cd mysql-boost-5.7.40/ yum install -y cmake gcc-c bison #安装依赖性 cmake -DCMAKE_INSTALL_PREFIX/usr/local/mysql -DMYSQL_DATADIR/data/mysql -DMYSQL_…

CCF-CSP认证考试 202212-3 JPEG 解码 100分题解

更多 CSP 认证考试题目题解可以前往&#xff1a;CSP-CCF 认证考试真题题解 原题链接&#xff1a; 202212-3 JPEG 解码 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 问题背景 四年一度的世界杯即将画上尾声。在本次的世界杯比赛中&#xff0c;视频助理裁判&…

pytorch实战-2张量类型处理

1 图像类型 有多种库可加载图像&#xff0c;如imageio&#xff0c; torchvision等。张量对图像维度排序一般为通道数x图像长x图像宽 1.1 imageio import imageioimg_t imageio.imread(img_path) 1.2 改变布局 可对tensor调用permute方法改变张量某个维度元素排序 和转置类…

软件测试基础(2)

如何开始第一次测试 作为一个菜鸟在进入测试团队开始第一次测试的时候, 我们需要做很多准备: 1.阅读所有项目有关的文档, 包括:需求文档, 设计文档, 用户手册. 2.尽可能参加各种项目会议, 了解项目的背景, 人员组成, 尽可能的了解需求和业务. 特别针对业务专业性较强的项目, 例…

存储的过程

一、存储过程 1.1 概述 存储过程可以轻松而高效的去完成这个需求&#xff0c;有点类似shell脚本里的函数 1.2 特点 存储过程在数据库中创建并保存&#xff0c;它不仅仅是 SQL 语句的集合&#xff0c;还可以加入一些特殊的控制结构&#xff0c;也可以控制数据的访问方式。存储过…

6.二叉树——1.指针

指针详解 指针&#xff0c;即地址&#xff0c;是一个数字&#xff0c;也可以申请一片内存空间将指针值存起来指针可以定位到内存中不同的字节运算符*&#xff1a;*p表示取地址p上存储的值&#xff0c;即间接访问**int ***&#xff1a;基类型为int的指针变量&#xff0c;基类型…

从入门到精通:NTP卫星时钟服务器技术指南

从入门到精通&#xff1a;NTP卫星时钟服务器技术指南 从入门到精通&#xff1a;NTP卫星时钟服务器技术指南 一、 产品功能 卫星时钟服务器是一款采用GPS或北斗卫星提供高精度网络时间服务的产品。卫星天线安装简便&#xff08;根据天线所放位置提示实时卫星颗数&#xff09;&a…

实现商铺和缓存与数据库双写一致

2.4 实现商铺和缓存与数据库双写一致 核心思路如下&#xff1a; 修改ShopController中的业务逻辑&#xff0c;满足下面的需求&#xff1a; 根据id查询店铺时&#xff0c;如果缓存未命中&#xff0c;则查询数据库&#xff0c;将数据库结果写入缓存&#xff0c;并设置超时时间…

从头搭建GPT(Andrej Karpathy) 笔记

本文来自openAI联合创始人,曾担任特斯拉视觉部门总监的Andrej的视频Let’s build GPT。 文章目录 简单介绍数据处理部分什么是tokenize计算loss直觉上的self-attention矩阵乘法实现self-attention:self-attention和cross-attention有什么区别attention中为什么要做scaling继续…

标定系列——预备知识-OpenCV中与标定板处理相关的函数(四)

标定系列——预备知识-OpenCV中与标定板处理相关的函数&#xff08;四&#xff09; 说明记录棋盘格圆网格 说明 记录了OpenCV中与标定板处理相关的函数用法 记录 棋盘格 圆网格

AWS SES发送邮件时常见的错误及解决方法?

AWS SES发送邮件如何做配置&#xff1f;使用AWS SES发信的限制&#xff1f; 在使用AWS SES发送邮件时&#xff0c;可能会遇到一些常见的错误。AokSend将介绍一些常见的AWS SES发送邮件错误及其相应的解决方法&#xff0c;帮助用户更好地利用AWS SES进行邮件发送。 AWS SES发送…

阿里云ubuntu服务器搭建可视化界面

连接终端 最好初始化服务器的时候 不要以root权限创建 否则会出错 1更新软件: sudo apt-get update2安装ubuntu desktop : sudo apt-get install ubuntu-desktop3 配置ubuntu desktop并重启: sudo apt-get -f install sudo dpkg-reconfigure ubuntu-desktop sudo reboot4 su…