MySQL-存储过程

介绍

基本语法

创建

调用

查看

删除

变量

系统变量

查看

设置

用户定义变量

赋值

使用

局部变量

声明

赋值

流程控制

参数

条件结构

IF

case

循环结构

while

repeat

loop

游标

条件处理程序


介绍

举个简单的例子,我们先select某数据,然后update,再update。这一系列操作指令是在MySQL中

下达的,然后指令传输到应用层,那么导致的问题就是,多次的指令传输会涉及到网络的请求。

所以存储过程就是,由一系列SQL语句经过编译后的指令集合,通过调用这个集合可以简化开发者的流程。最重要的是,能够减少数据在数据库和应用服务器之间的传输,提高数据处理的效率。

储存过程的思想很简单,就是在SQL语言层面的代码的封装和重用。

存储过程的特点:

  1. 封装、复用
  2. 可以接受参数、也可以返回数据
  3. 减少网络层的交互,提升效率

基本语法

创建

create procedure p1() --存储过程名称,也可以添加参数
begin--具体的SQL语句
end;

调用

call p1();

查看

  • 通过MySQL系统中的信息查看
select *from information_schema.ROUTINES where ROUTINE_SCHEMA = 'text';
--数据库名
  • 查看创建语句
show create procedure p1;

删除

drop procedure [if exist] p1;

注意!!!如果使用命令行执行存储过程的创建语句,会报错:

这是因为,在命令行中以分号为一句命令的结束,所以会导致报错。

所以在命令行中执行创建语句时,应该使用delimiter关键字指定命令结束符:

delimiter $$  --指定两个美元符号为结束符号create procedure p1() --存储过程名称,也可以添加参数
begin-----;
end;$$

变量

  • 系统变量

系统变量是MySQL服务器指定的,不是用户定义的,属于服务器层面,Global(全局变量)、Session(会话变量,只代表当前会话)

查看

show variables;
--show global variables;
--show session variables;show variables like 'ac%';
--模糊匹配select @@activate_all_roles_on_login;
--查找指定的系统变量名

设置

set session 系统变量名 = 值;
--set global 系统变量名 = 值;

注意:

  • 当没有指定global和session时,系统默认是session会话变量
  • 当mysql重启时没所有设置的全局参数将会失效,要想不失效,可以在配置文件中配置

  • 用户定义变量

赋值

set @myname = 'John';
set @myage := 10; 
--相当于定义了两个变量,并且赋值set @mynumber = 12345 , @myaddress = '北京市';
--可以同时定义两个用户变量select set @mycolor := '中国红';
--可以使用select进行赋值select count(*) into @mynum from users;
--可以使用其他表的字段来进行赋值

使用

select @mycolor,@myage;
  • 局部变量

声明

declare user_num int;
--user_num是局部变量名

赋值

与用户自定义变量赋值相似

流程控制

参数

create procedure p2(in score int,out ret varchar(10))
beginif score >=15 thenset ret = '优秀';elseset ret = '及格';end if;
end;call p2(18,@ret);
select @ret;

运行结果:

条件结构

  • IF

create procedure p2()
begindeclare score int default 20;declare ret varchar(10);if score >=15 thenset ret = '优秀';elseset ret = '及格';end if;select ret;
end;call p2();

还是比较好理解的,类似于编程语言中的IF语句。

  • case

create procedure p3(in month int)
begindeclare ret varchar(10);casewhen month>=1 and month<=3 thenset ret := '第一季度';when month>=4 and month<=6 thenset ret := '第二季度';when month>=7 and month<=9 thenset ret := '第三季度';when month>=10 and month<=12 thenset ret := '第四季度';else set ret := '非法参数';end case;select concat('您输入的月份为:',month,' 所属季度为:',ret);
end;call p3(12);

循环结构

  • while

WHILE   条件   DO

        SQL逻辑语句

END WHILE;

演示

输入一个参数n,返回从1到n的累加

create procedure p4(in n int)
begindeclare total int default 0;while n>=1 doset total = total + n;set n = n - 1;end while;select total;
end;call p4(10);

运行结果

  • repeat

满足条件退出循环

repeat

        SQL逻辑语句

UNTIL   条件

end   repeat;

  • loop

 loop一般配合下面两个语句使用:

  1. LEAVE(直接退出循环)
  2. ITERATE(跳过本次循环的剩下语句,然后进入下一次循环)
create procedure p4(in n int)
begindeclare total int default 0;sum loop:if n<=0 thenleave;end if;set total = total + n;set n = n - 1;end loop sum;select total;
end;call p4(10);

游标

游标是用来存储查询数据集的数据类型,在存储过程或函数过程中对结果集进行循环的处理。

  • 声明游标

declare  游标名  cursor  查询结果集;

--输入年龄上限,将所有小于该年龄的数据的部分字段,作为一个游标create procedure p5(in n int)
begindeclare uname varchar(10);declare ugender varchar(10);declare u_cursor cursor for select user_name,user_gender from users where user_age<=n;drop table if exists u_name_gen;create table if not exists u_name_gen(id int primary key auto_increment,name varchar(10),gender varchar(10));open u_cursor;while true dofetch u_cursor into uname,ugender;insert into u_name_gen values (null,uname,ugender);end while;close u_cursor;end;call p5(32);

这里要注意的是,表确实创建成功了,但是MySQL依然会报错:

这里的原因在于存储过程中的循环没有有效的停止。 

条件处理程序

条件处理程序用于在存储过程中抛出异常时,解决问题的相应步骤。

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

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

相关文章

debug 笔记:llama 3.2 部署bug 之cutlassF: no kernel found to launch!

1 问题描述 按照官方的写法 import torch from transformers import pipeline import os os.environ["HF_TOKEN"] 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 model_id "meta-llama/Llama-3.2-3B"pipe pipeline("text-generation", modelmode…

《Python实战进阶》No34:卷积神经网络(CNN)图像分类实战

第34集&#xff1a;卷积神经网络&#xff08;CNN&#xff09;图像分类实战 摘要 卷积神经网络&#xff08;CNN&#xff09;是计算机视觉领域的核心技术&#xff0c;特别擅长处理图像分类任务。本集将深入讲解 CNN 的核心组件&#xff08;卷积层、池化层、全连接层&#xff09;…

【银河麒麟系统常识】命令:uname -m(查看系统架构)

命令&#xff1a; uname -m 功能 常用的 Linux/Unix 终端命令&#xff0c;用于显示当前系统的硬件架构&#xff1b; 返回 返回系统的CPU架构类型&#xff0c;用于判断软件兼容性&#xff1b; 输出结果架构说明常见设备x86_64Intel/AMD 64位 CPU主流 PC、服务器aarch64ARM 64位 …

游戏引擎学习第183天

回顾和今天的计划 我对接下来的进展感到非常兴奋。虽然我们可能会遇到一些问题&#xff0c;但昨天我们差不多完成了将所有内容迁移到新的日志系统的工作&#xff0c;我们正在把一些内容整合进来&#xff0c;甚至是之前通过不同方式记录时间戳的旧平台层部分&#xff0c;现在也…

Redisson 实现分布式锁简单解析

目录 Redisson 实现分布式锁业务方法&#xff1a;加锁逻辑LockUtil 工具类锁余额方法&#xff1a;工具类代码枚举代码 RedisUtil 工具类tryLock 方法及重载【分布式锁具体实现】Supplier 函数式接口调用分析 Redisson 实现分布式锁 业务方法&#xff1a; 如图&#xff0c;简单…

鸿蒙Flutter实战:19-Flutter集成高德地图,跳转页面方式

前言 在之前的文章现有Flutter项目支持鸿蒙II中&#xff0c;介绍了如何使用第三方插件&#xff0c;同时给出了非常多的使用案例&#xff0c;如 flutter_inappwebview&#xff0c;video_player, image_picker 等&#xff0c;本文将开始介绍如何集成高德地图。 整体方案 通过 …

26考研——图_图的代码实操(6)

408答疑 文章目录 五、图的代码实操图的存储邻接矩阵结构定义初始化插入顶点获取顶点位置在顶点 v1 和 v2 之间插入边获取第一个邻接顶点获取下一个邻接顶点显示图 邻接表结构定义初始化图插入顶点获取顶点位置在顶点 v1 和 v2 之间插入边获取第一个邻接顶点获取下一个邻接顶点…

力扣32.最长有效括号(栈)

32. 最长有效括号 - 力扣&#xff08;LeetCode&#xff09; 代码区&#xff1a; #include<stack> #include<string> /*最长有效*/ class Solution { public:int longestValidParentheses(string s) {stack<int> st;int ans0;int ns.length();st.push(-1);fo…

Node.js 下载安装及环境配置教程、卸载删除环境配置超详细步骤(附图文讲解!) 从零基础入门到精通,看完这一篇就够了

Node.js 安装 一、进入官网地址下载安装包 Node.js — Download Node.js 选择对应你系统的Node.js版本&#xff0c;这里我选择的是Windows系统、64位 Tips&#xff1a;如果想下载指定版本&#xff0c;点击【以往的版本】&#xff0c;即可选择自己想要的版本下载 二、安装程序…

SQLark导出功能详解|轻松管理数据库数据与结构

SQLark 作为一款数据库管理工具&#xff0c;为用户提供了丰富且实用的导出功能。在数据库管理与开发过程中&#xff0c;数据及结构的导出操作至关重要&#xff0c;关乎数据的迁移、备份、版本管理以及问题定位等诸多关键环节。接下来&#xff0c;让我们深入了解 SQLark 的导出功…

搭建Redis主从集群

主从集群说明 单节点Redis的并发能力是有上限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写分离。 主从结构 这是一个简单的Redis主从集群结构 集群中有一个master节点、两个slave节点&#xff08;现在叫replica&#xff09;…

自然语言处理(NLP)技术的应用面有哪些

自然语言处理&#xff08;NLP&#xff09;技术在各个领域都有广泛的应用&#xff0c;以下是一些常见的例子&#xff1a; 机器翻译&#xff1a;NLP技术用于开发翻译系统&#xff0c;可以将一个语言的文本自动翻译成另一种语言。例如&#xff0c;谷歌翻译就是一个应用了NLP技术的…

element-plus 的简单应用

前言 本篇博客是 基于 ElementPlus 快速入门_element plus x-CSDN博客 的进阶 最终成果 完成的要求 1 深入学习 设计 | Element Plus 从里面找自己合适的 使用到的 组件有&#xff1a;表格&#xff0c;分页条&#xff0c;表单&#xff0c;卡片 2 具备 前端基础&#xff08;ht…

关于Qt的各类问题

目录 1、问题&#xff1a;Qt中文乱码 2、问题&#xff1a;启动时避免ComBox控件出现默认值 博客会不定期的更新各种Qt开发的Bug与解决方法,敬请关注! 1、问题&#xff1a;Qt中文乱码 问题描述&#xff1a;我在设置标题时出现了中文乱码 this->setWindowTitle("算法…

海思烧录工具HITool电视盒子刷机详解

HiTool是华为开发的一款用于海思芯片设备的刷机和调试工具&#xff0c;可对搭载海思芯片的机顶盒、智能电视等设备进行固件烧录、参数配置等操作。以下为你详细介绍&#xff1a; 功能用途 固件烧录&#xff1a;这是HiTool最主要的功能之一。它能够将下载好的适配固件文件烧录到…

Docker Compose介绍

基本概念 Docker-Compose是Docker官方的开源项目&#xff0c;负责实现对docker容器集群的快速编排。 可以这么理解&#xff0c;docker compose是docker提出的一个工具软件&#xff0c;可以管理多个docker容器组成一个应用&#xff0c;只需要编写一个YAML格式的配置文件docker…

大疆上云api直播功能如何实现

概述 流媒体服务器作为直播画面的中转站,它接收推流端的相机画面,同时拉流端找它获取相机的画面。整个流程如下: 在流媒体服务器上创建流媒体应用(app),一个流媒体服务器上面可以创建多个流媒体应用约定推拉流的地址。假设流媒体服务器工作在1935端口上面,假设创建的流…

LabVIEW远程控制通讯接口

abVIEW提供了多种远程控制与通讯接口&#xff0c;适用于不同场景下的设备交互、数据传输和系统集成。这些接口涵盖从基础的网络协议&#xff08;如TCP/IP、UDP&#xff09;到专用技术&#xff08;如DataSocket、远程面板&#xff09;&#xff0c;以及工业标准协议&#xff08;如…

算法每日一练 (18)

&#x1f4a2;欢迎来到张翊尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 算法每日一练 (18)删除并获得点数题目描述解题思路解题…

Java后端API限流秘籍:高并发的防护伞与实战指南

目录导航 📜 🛡️ 为什么需要API限流?🧠 主流限流算法大解析👩‍💻 阿里巴巴的限流实践📏 四大黄金定律🤼 限流策略组合拳🏆 限流场景实战💻 技术实现方案🌟 最佳实践分享📈 结语与展望📚 推荐阅读 1. 🛡️ 为什么需要API限流? 在高并发环境中,未…