MySQL数据库存储过程介绍

news/2024/4/28 10:31:55/文章来源:https://blog.csdn.net/qq_64612585/article/details/137094339

目录

一、存储过程

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.luyixian.cn/news_show_1028120.aspx

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

相关文章

c++指针最全总结(附源码和详细总结)

目录 哈喽&#xff0c;我又来啦&#x1f604; 指针是什么&#xff1f;What is a pointer&#xff1f; 简单点说 一级指针的定义 指针的赋值 指针的输出 二级指针的定义 简单说 二级指针的赋值 二级指针的输出 改变一级指针指向 二级指针的步长 改变n-1级指针的指向 …

R语言赋值符号<-、=、->、<<-、->>的使用与区别

R语言的赋值符号有&#xff1c;-、、-&#xff1e;、&#xff1c;&#xff1c;-、-&#xff1e;&#xff1e;六种&#xff0c;它们的使用与区别如下: <-’&#xff1a;最常用的赋值符号。它将右侧表达式的值赋给左侧的变量&#xff0c;像一个向左的箭头。例如&#xff0c;x …

Spring Boot 实现定时任务动态管理

前言 本文主要介绍了SpringBoot架构下动态定时任务的使用&#xff0c;定时任务表达式配置在数据库中&#xff0c;通过反射执行到目标方法。 Quartz Quartz 是一个开源的作业调度框架,支持分布式定时任务&#xff0c;Quartz定时任务据我了解可分为Trigger&#xff08;触发器&…

JavaEE企业开发新技术4

2.16 模拟Spring IOC容器功能-1 2.17 模拟Spring IOC容器功能-2 什么是IOC&#xff1f; 控制反转&#xff0c;把对象创建和对象之间的调用过程交给Spring框架进行管理使用IOC的目的&#xff1a;为了耦合度降低 解释&#xff1a; 模仿 IOC容器的功能&#xff0c;我们利用 Map…

计算机网络:物理层 - 传输媒体

计算机网络&#xff1a;物理层 - 传输媒体 物理层基本概念导引型传输媒体同轴电缆双绞线光纤 非引导型传输媒体无线电波微波红外线 物理层基本概念 在计算机网络中用来连接各种网络设备的传输媒体&#xff0c;种类众多&#xff0c;大致可以分为两类&#xff0c;一类是导引型传…

Docker进阶:Docker Swarm(集群搭建) —实现容器编排的利器

Docker进阶&#xff1a;Docker Swarm&#xff08;集群搭建&#xff09; —实现容器编排的利器 1、什么是Docker Swarm&#xff1f;2、Docker Swarm 与 Docker Compose的区别3、创建一个Swarm集群&#xff08;1-Manager&#xff0c;2-Worker&#xff09;1、资源准备2、初始化Swa…

【JavaEE初阶系列】——带你了解volatile关键字以及wait()和notify()两方法背后的原理

目录 &#x1f6a9;volatile关键字 &#x1f388;volatile 不保证原子性 &#x1f388;synchronized 也能保证内存可见性 &#x1f388;Volatile与Synchronized比较 &#x1f6a9;wait和notify &#x1f388;wait()方法 &#x1f4bb;wait(参数)方法 &#x1f388;noti…

8.HelloWorld小案例

文章目录 一、Java程序开发运行流程如何理解编译&#xff1f; 二、HelloWorld案例的编写1、新建文本文档文件&#xff0c;修改名称为HelloWorld.java。2、用记事本打开HelloWorld.java文件&#xff0c;输写程序内容。代码要跟我编写的完全保持一致。3、ctrl s 保存&#xff0c…

JavaScript基础练习题之计算数组元素的和与平均值

一、如何使用JavaScript计算数组元素的和与平均值&#xff1f; 二、正确的源程序 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>计算数组元素的和与平均值</title></head><body><h1>计算数组元…

AIGC重塑金融 | 大模型在金融行业的应用场景和落地路径

作者&#xff1a;林建明 来源&#xff1a;IT阅读排行榜 本文摘编自《AIGC重塑金融&#xff1a;AI大模型驱动的金融变革与实践》&#xff0c;机械工业出版社出版 目录 01 大模型在金融领域的 5 个典型应用场景 02 大模型在金融领域应用所面临的风险及其防范 03 AIGC 技术的科…

蓝桥杯 - 小明的背包3(多重背包)

解题思路&#xff1a; 动态规划 多重背包问题需要在01背包问题&#xff08;不重复&#xff09;的基础上多加一层循环进行遍历&#xff0c;并且dp[ j ]的式子也需要修改 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan …

CSS及javascript

一、CSS简介 css是一门语言&#xff0c;用于控制网页的表现。 cascading style sheet:层叠样式表 二、css的导入方式 css代码与html代码的结合方式 &#xff08;1&#xff09;css导入html有三种方式&#xff1a; 1.内联样式&#xff1a;<div style"color:red&quo…

element-ui autocomplete 组件源码分享

紧接着 input 组件的源码&#xff0c;分享带输入建议的 autocomplete 组件&#xff0c;在 element-ui 官方文档上&#xff0c;没有这个组件的 api 目录&#xff0c;它的 api 是和 input 组件的 api 在一起的&#xff0c;看完源码之后发现&#xff0c;源码当中 autocomplete 组件…

MySQL中的基本SQL语句

文章目录 MySQL中的基本SQL语句查看操作创建与删除数据库和表修改表格数据库用户管理 MySQL中的基本SQL语句 查看操作 1. 查看有哪些数据库 show databases; 2.切换数据库 use 数据库名;比如切换至 mysql数据库 use mysql;3.查看数据库中的表 show tables;4.查看表中…

新能源汽车驱动电机振动噪音分析

驱动电机示例图 驱动电机的噪声主要分为空气动力噪声、电磁噪声和机械噪声。其中在高速运转时空气动力噪声是主要噪声&#xff0c;中低速运转时电磁噪声为主要噪声。 1、空气动力噪声&#xff1a; 空气噪声主要由于风扇转动&#xff0c;使空气流动、撞击、摩擦而产生&#x…

ARM-按键中断实验

代码 #include "stm32mp1xx_gic.h" #include "stm32mp1xx_exti.h" extern void printf(const char *fmt, ...); unsigned int i 0; void do_irq(void) {//获取要处理的中断的中断号unsigned int irqnoGICC->IAR&0x3ff;switch (irqno){case 99:pr…

2023年后端面试总结

备注&#xff1a;这篇文章是我在2023年年初在自己的网站上写的&#xff0c;最近在迁移技术文章&#xff0c;我感觉这个也是和咱程序员相关&#xff0c;所以今天就决定把它迁移过来。 .......................................................................分割线..........…

AJAX-综合

文章目录 同步代码和异步代码回调函数地狱解决回调函数地狱Promise-链式调用async函数和awaitasync函数和await-捕获错误 事件循环宏任务与微任务Promise.all静态方法 同步代码和异步代码 同步代码&#xff1a;逐步执行&#xff0c;需原地等待结果后&#xff0c;才继续向下执行…

后端常问面经之计算机网络

一台机器理论上能创建多少条TCP连接&#xff1f; Linux每维护一条TCP连接都要花费内存资源的&#xff0c;每一条静止状态&#xff08;不发送数据和不接收数据&#xff09;的 TCP 连接大约需要吃 3.44K 的内存&#xff0c;那么 8 GB 物理内存的服务器&#xff0c;最大能支持的 …

微服务day07 -- 搜索引擎 ( 数据聚合 + 自动补全 + 数据同步 + ES集群 )

1.数据聚合 聚合&#xff08;aggregations&#xff09;可以让我们极其方便的实现对数据的统计、分析、运算。例如&#xff1a; 什么品牌的手机最受欢迎&#xff1f; 这些手机的平均价格、最高价格、最低价格&#xff1f; 这些手机每月的销售情况如何&#xff1f; 实现这些…