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: school
                Name: name1
                Type: PROCEDURE
             Definer: root@localhost
            Modified: 2024-03-27 18:58:42
             Created: 2024-03-27 18:58:42
       Security_type: DEFINER
             Comment: 
character_set_client: utf8
collation_connection: utf8_general_ci
  Database 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.mfbz.cn/a/497503.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

持续集成流水线介绍(CI)

目录 一、概述 二、持续集成的典型操作流程 2.1 概述 2.2 持续集成的操作流程图 2.3 持续集成关键流程说明 三、构建持续集成流水线的方式 3.1 依托云厂商能力 3.2 采用开源产品 3.3 企业自研 四、构建持续化集成流水线 4.1 基于GitHub的持续集成流水线&#xff08;公…

Haproxy2.8.1+Lua5.1.4部署,haproxy.cfg配置文件详解和演示

目录 一.快速安装lua和haproxy 二.配置haproxy的配置文件 三.配置haproxy的全局日志 四.测试负载均衡、监控和日志效果 五.server常用可选项 1.check 2.weight 3.backup 4.disabled 5.redirect prefix和redir 6.maxconn 六.调度算法 1.静态 2.动态 一.快速安装lu…

uniApp使用XR-Frame创建3D场景(5)材质贴图的运用

上一篇讲解了如何在uniApp中创建xr-frame子组件并创建简单的3D场景。 这篇我们讲解在xr-frame中如何给几何体赋予贴图材质。 先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"><xr-node><xr-assets><xr-asse…

Go的数据结构与实现【Set】

介绍 Set是值的集合&#xff0c;可以迭代这些值、添加新值、删除值并清除集合、获取集合大小并检查集合是否包含值&#xff0c;集合中的一个值只存储一次&#xff0c;不能重复。 本文代码地址为go-store 简单实现 这是集合的一个简单实现&#xff0c;还不是并发安全的&#…

【tensorflow框架神经网络实现鸢尾花分类】

文章目录 1、数据获取2、数据集构建3、模型的训练验证可视化训练过程 1、数据获取 从sklearn中获取鸢尾花数据&#xff0c;并合并处理 from sklearn.datasets import load_iris import pandas as pdx_data load_iris().data y_data load_iris().targetx_data pd.DataFrame…

kubernetes K8s的监控系统Prometheus升级Grafana,来一个酷炫的Node监控界面(二)

上一篇文章《kubernetes K8s的监控系统Prometheus安装使用(一)》中使用的监控界面总感觉监控的节点数据太少&#xff0c;不能快算精准的判断出数据节点运行的状况。 今天我找一款非常酷炫的多维度数据监控界面&#xff0c;能够非常有把握的了解到各节点的数据&#xff0c;以及运…

快速上手Spring Cloud 七:事件驱动架构与Spring Cloud

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …

AOP切入点表达式基本格式

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 官方地址 https://docs.spring.io/spring-framework/reference/core/aop/ataspectj/pointcuts.html AOP切入点表达式基本格式如下&#xff1a; execution(modifiers-patte…

竞赛 python+opencv+深度学习实现二维码识别

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; pythonopencv深度学习实现二维码识别 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;3分 该项目较为新颖&…

ES6 学习(三)-- es特性

文章目录 1. Symbol1.1 使用Symbol 作为对象属性名1.2 使用Symbol 作为常量 2. Iterator 迭代器2.1 for...of循环2.2 原生默认具备Interator 接口的对象2.3 给对象添加Iterator 迭代器2.4 ... 解构赋值 3. Set 结构3.1 初识 Set3.2 Set 实例属性和方法3.3 遍历3.4 相关面试题 4…

RabbitMQ3.x之四_RabbitMQ角色说明及创建用户与授权

RabbitMQ3.x之四_角色说明及创建用户与授权 文章目录 RabbitMQ3.x之四_角色说明及创建用户与授权1. 访问和授权1. Tags说明2. 命令行示例 2. 管理界面新建用户及访问授权1. 管理界面新建用户2. 管理界面中的授权说明3. guest用户不能远程登录提示 3. 创建用户1. 基本命令2. 实际…

新网站收录时间是多久,新建网站多久被百度收录

对于新建的网站而言&#xff0c;被搜索引擎收录是非常重要的一步&#xff0c;它标志着网站的正式上线和对外开放。然而&#xff0c;新网站被搜索引擎收录需要一定的时间&#xff0c;而且时间长短受多种因素影响。本文将探讨新网站收录需要多长时间&#xff0c;以及新建网站多久…

微信小程序更换头像的功能

微信小程序开发&#xff0c;个人中心中更换头像的更能使用频率很高&#xff0c;这里记录下实现方式&#xff1a; <view class"setting-list avatar-container"><text>头像</text><view class"avatar"><button hover-class"…

华为云使用指南02

5.​​使用GitLab进行团队及项目管理​​ GitLab旨在帮助团队进行项目开发协作&#xff0c;为软件开发和运营生命周期提供了一个完整的DevOps方案。GitLab功能包括&#xff1a;项目源码的管理、计划、创建、验证、集成、发布、配置、监视和保护应用程序等。该镜像基于CentOS操…

ZK友好代数哈希函数安全倡议

1. 引言 前序博客&#xff1a; ZKP中的哈希函数如何选择ZK-friendly 哈希函数&#xff1f;snark/stark-friendly hash函数Anemoi Permutation和Jive Compression模式&#xff1a;高效的ZK友好的哈希函数Tip5&#xff1a;针对Recursive STARK的哈希函数 随着Incrementally Ve…

STM32 字符数组结束符 “\0”

STM32 字符数组结束符 “\0” 使用字符数组使用printf&#xff0c;string参考 使用字符数组 使用STM32的串口发送数据&#xff0c;核心代码如下&#xff1a; char str[] "hello world!\n\r";while(1) {HAL_UART_Transmit(&huart2, str, sizeof (str), 10);HAL…

构建一个基础的大型语言模型(LLM)应用程序

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Radio Silence for mac 好用的防火墙软件

Radio Silence for Mac是一款功能强大的网络防火墙软件&#xff0c;专为Mac用户设计&#xff0c;旨在保护用户的隐私和网络安全。它具备实时网络监视和控制功能&#xff0c;可以精确显示每个网络连接的状态&#xff0c;让用户轻松掌握网络活动情况。 软件下载&#xff1a;Radio…

图扑数字孪生智慧城市,综合治理一屏统览

现代城市作为一个复杂系统&#xff0c;牵一发而动全身&#xff0c;城市化进程中产生新的矛盾和社会问题都会影响整个城市系统的正常运转。智慧城市是应对这些问题的策略之一。领导曾在中央城市工作会议上指出&#xff0c;城市工作要树立系统思维&#xff0c;从构成城市诸多要素…

探索数据库mysql--------------mysql主从复制和读写分离

目录 前言 为什么要主从复制&#xff1f; 主从复制谁复制谁&#xff1f; 数据放在什么地方&#xff1f; 一、mysql支持的复制类型 1.1STATEMENT&#xff1a;基于语句的复制 1.2ROW&#xff1a;基于行的复制 1.3MIXED&#xff1a;混合类型的复制 二、主从复制的工作过程 三个重…
最新文章