当前位置: 首页 > news >正文

SQL基础理论篇(九):存储过程

文章目录

  • 简介
  • 存储过程的形式
    • 定义一个存储过程
    • 使用delimiter定义语句结束符
    • 存储过程中的三种参数类型
    • 流控制语句
  • 存储过程的优缺点
  • 参考文献

简介

存储过程Stored Procedure,SQL中的另一个重要应用。

前面说的视图,只能勉强跟编程中的函数相似,存储过程更进一步逼近了函数这一概念。 视图仍然局限在SQL语句这个范畴,但是存储过程已经可以进一步使用控制语句了。或许,存储过程可以视为是视图的更进一步

存储过程是由SQL语句和流控制语句组成的语句集合,和函数一样,它可以接收输入参数,也可以把结果返回。一旦存储过程被创建出来,使用它就像使用函数一样简单,直接调用存储过程名就可以。

先简单看了一下存储过程究竟是什么,该怎么用,给我的感觉是:存储过程就是遵循模块化编程的指导思想下的一个比较简陋的产品。

按教程的内容,本节将主要介绍以下部分:

  • 存储过程的形式;
  • 存储过程中各组成部分的介绍;
  • 存储过程的优缺点。

存储过程的形式

定义一个存储过程

create procedure 存储过程名称([参数列表])
begin需要执行的语句
end

和视图一样,删除存储过程是drop procedure,更新存储过程是alter procedure。

举一个例子,写一个简单的存储过程,计算1+2+3+…+n等于多少。

delimiter //
create procedure `add_num`(IN n INT)
begindeclare i int;declare sum int;set i=1;set sum=0;while i <= n doset sum = sum + i;set i = i+1;end while;select sum;
end //
delimiter ;

使用delimiter将’//‘作为整个存储过程的结束符号,并在最后将结束符重新定义回默认的’;’

然后我们需要计算1到50的累加之和时,只需要调用call add_num(50);即可。

使用delimiter定义语句结束符

以MySQL举例,如果使用Navicat这种图形化工具来编写存储过程的话,是不需要手动定义delimiter的,navicat会自己加。

但是如果你使用的工具没有提供这个功能,或者是你直接在后台手敲的,那么你需要显式用delimiter来定义结束符。

那么,为什么要定义语句结束符呢?

这是因为默认情况下MySQL使用分号,即;来作为结束符。

这样的话,在存储过程中的每一行SQL语句之后加分号,就相当于告诉SQL解释器,这一行已经结束了,可以执行这一句了。

但是有时候我们不希望SQL这样做,存储过程是一个整体,我们更希望存储过程整段一起执行,所以我们需要临时定义新的delimiter,比如说’//'或者’$$‘。

存储过程中的三种参数类型

分别是IN、OUT、和INOUT型。

在这里插入图片描述

IN在存储过程中不能返回,即存储过程之外无法调用到in类型的参数,但是out和inout是可以调到的。

create procedure `func`(out max_hp float,out min_hp float,s varchar(255)
)
beginselect max(hp), min(hp)from heroswhere role_category=sinto max_hp, min_hp;
end

可以看到定义了两个out类型的参数用来接收返回值,定义了一个参数s用来接收输入,缺省情况下是IN参数

那怎么读取到存储过程返回的结果呢?

call func(@max_hp, @min_hp, '战士');
select @max_hp, @min_hp;

就可以把结果打印出来了。

流控制语句

常用的流控制语句有:

  1. begin…end:表示存储过程的范围,有点像编程里的花括号;

  2. declare:声明变量用,变量在使用前必须提前声明,声明方式declare var_name var_type;

  3. set: 赋值语句,用于变量赋值,如set var_name = value;

  4. select…into:把查询结果存到out类变量中,就是利用select来为变量赋值;

  5. if…then…elseif…then…else…endif;

  6. case:

    casewhen 表达式1 then...when 表达式2 then...else...
    end
    
  7. LOOP、leave、iterate:LOOP是循环语句,类似for循环。leave中止本层循环,类似break。iterate中止本次循环,类似continue;

  8. repeat…until…end repeat:有点类似编程里的do while语句。repeat是先执行一次循环,然后until做表达式判断,如果满足条件就退出(这里跟while是不同的),即走end repeat;若条件不满足,则继续执行循环,直到满足条件;

  9. while…do…end while:这个跟while没有区别,满足条件就循环,不满足就退出;

存储过程的优缺点

当前对存储过程的使用一直都有争议。有些公司对大型项目要求使用存储过程,但有些公司却明令禁止使用(如阿里)。

优点:

  1. 一次编译多次使用。存储过程只在创建时执行编译,之后都不需要再进行编译;
  2. 减少开发工作量。将代码封装成模块,实际上是模块化编程思想。这样,多个模块之间可以重复使用,而且也方便复杂查询的拆解。
  3. 安全。可以设定哪些用户可以使用存储过程。
  4. 减少网络传输量。连接一次数据库,执行整个存储过程即可,不需要多次连接数据库,一行一行执行代码。

缺点:

  1. 可移植性差。无法跨数据库移植。
  2. 调试困难。多数DBMS不支持存储过程的调试,所以对于复杂的存储过程,其开发和维护都相当困难。
  3. 版本管理困难。存储过程本身没有版本控制,在迭代更新时会比较麻烦。另外,存储过程很容易失效,比如说数据表索引发生变化时,可能会导致失效;
  4. 不适合高并发。对于分库分表的并发查询,很难维护。

参考文献

  1. 13丨什么是存储过程,在实际项目中用得多么?

相关文章:

SQL基础理论篇(九):存储过程

文章目录 简介存储过程的形式定义一个存储过程使用delimiter定义语句结束符存储过程中的三种参数类型流控制语句 存储过程的优缺点参考文献 简介 存储过程Stored Procedure&#xff0c;SQL中的另一个重要应用。 前面说的视图&#xff0c;只能勉强跟编程中的函数相似&#xff…...

申银万国期货通过ZStack Cube信创超融合一体机打造金融信创平台

信创是数字中国建设的重要组成部分&#xff0c;也是数字经济发展的关键推动力量。作为云基础软件企业&#xff0c;云轴科技ZStack产品矩阵全面覆盖数据中心云基础设施&#xff0c;ZStack信创云首批通过可信云《一云多芯IaaS平台能力要求》先进级&#xff0c;是其中唯一兼容四种…...

SquareCTF-2023 Web Writeups

官方wp&#xff1a;CTFtime.org / Square CTF 2023 tasks and writeups sandbox Description&#xff1a; I “made” “a” “python” “sandbox” “”“” nc 184.72.87.9 8008 先nc连上看看&#xff0c;只允许一个单词&#xff0c;空格之后的直接无效了。 flag就在当…...

Docker-compose 安装mysql8

1、编写docker-compose.yml文件 version: 3.8 services:mysql:container_name: mysql8image: mysql:8.0.18restart: alwaysports:- 3306:3306privileged: truevolumes:- $PWD/log:/var/log/mysql- $PWD/conf/my.cnf:/etc/mysql/my.cnf- $PWD/data:/var/lib/mysqlenvironment:M…...

分布式锁实现对比

1、对比 tairzookeper性能高 低可靠性低 高 2、zookeper实现分布式锁 特点&#xff1a; Zookeeper能保证数据的强一致性&#xff0c;用户任何时候都可以相信集群中每个节点的数据都是相同的。 加锁 客户端在ZooKeeper一个特定的节点下创建临时顺序节点&…...

Ubuntu 系统上使用 QQ 邮箱的 SMTP 服务器发送邮件,msmtp(已验证)

安装 msmtp sudo apt-get update sudo apt-get install msmtp2 .配置 msmtp nano ~/.msmtprcdefaults auth on tls on tls_starttls on tls_trust_file /etc/ssl/certs/ca-certificates.crt logfile ~/.msmtp.logaccount qq host …...

笔记54:门控循环单元 GRU

本地笔记地址&#xff1a;D:\work_file\DeepLearning_Learning\03_个人笔记\3.循环神经网络\第9章&#xff1a;动手学深度学习~现代循环神经网络 a a a a a a a...

数据仓库高级面试题

数仓高内聚低耦合是怎么做的 定义 高内聚&#xff1a;强调模块内部的相对独立性&#xff0c;要求模块内部的元素尽可能的完成一个功能&#xff0c;不混杂其他功能&#xff0c;从而使模块保持简洁&#xff0c;易于理解和管理。 低耦合&#xff1a;模块之间的耦合度要尽可能的…...

【OpenGauss源码学习 —— 列存储(ColumnTableSample)】

执行算子&#xff08;ColumnTableSample&#xff09; 概述ColumnTableSample 类ColumnTableSample::ColumnTableSample 构造函数ColumnTableSample::~ColumnTableSample 析构函数ExecCStoreScan 函数ColumnTableSample::scanVecSample 函数ColumnTableSample::getMaxOffset 函数…...

【开源】基于JAVA的校园二手交易系统

项目编号&#xff1a; S 009 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S009&#xff0c;文末获取源码。} 项目编号&#xff1a;S009&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 二手商品档案管理模…...

C 语言结构体(struct)

C 语言结构体(struct) 在本教程中&#xff0c;您将学习C语言编程中的结构类型。您将借助示例学习定义和使用结构。 在C语言编程中&#xff0c;有时需要存储实体的多个属性。 实体不必仅具有一种类型的所有信息。 它可以具有不同数据类型的不同属性。 C 数组允许定义可存储相…...

Linux:zip包的压缩与解压

压缩文件&#xff1a; zip命令 语法&#xff1a; zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][-b <工作目录>][-ll][-n <字尾字符串>][-t <日期时间>][-<压缩效率>][压缩文件][文件...][-i <范本样式>][-x <范本样式>] 补充说明&#xff1a;zi…...

Linux 时区设置

对于服务器来说&#xff0c;linux的时区影响着运行之上的数据库和后端程序的时区 应该和数据库和后端及其他程序的时区保持一致 其他相关时区的设置 pgsql时区设置&#xff1a; php时区设置&#xff1a; 1.显示当前的时间和时区 date结果类似下面&#xff0c;图中显示的是ut…...

Linux本地WBO创作白板部署与远程访问

文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cpolar4. 配置WBO公网访问地址5. 公网远程访问WBO白板6. 固定WBO白板公网地址 前言 WBO在线协作白板是一个自由和开源的在线协作白板&#xff0c;允许多个用户同时在一个虚拟的大型白板上画图。该白板对所有线上用…...

leetcode刷题日记:205. Isomorphic Strings(同构字符串)

205. Isomorphic Strings(同构字符串) 对于同构字符串来说也就是对于字符串s与字符串t&#xff0c;对于 s [ i ] s[i] s[i]可以映射到 t [ i ] t[i] t[i],同时对于任意 s [ k ] s [ i ] s[k]s[i] s[k]s[i]都有 s [ k ] s[k] s[k]映射到 t [ k ] t[k] t[k],则 t [ k ] t [ i …...

Autox.js和Auto.js4.1.1手机编辑器不好用我自己写了一个编辑器

功能有 撤销 重做 格式化 跳转关键词 下面展示一些 内联代码片。 "ui"; ui.layout( <drawer id"drawer"><vertical><appbar><toolbar id"toolbar"title""h"20"/></appbar><horizontal b…...

docker logs 如何使用grep检索

无法使用docker logs <container> | grep xxx 这是因为管道仅对stdout有效&#xff0c;如果容器将日志记录到stderr&#xff0c;这种情况就会发生&#xff0c;这时可以尝试这样写 docker logs <container id> 2>&1 | grep xxx...

【教3妹学编辑-mysql】详解join(内连接、外连接、交叉连接等)

内连接、外连接、交叉连接、笛卡尔积 内连接(inner join):取得两张表中满足存在连接匹配关系的记录。外连接(outer join):不只取得两张表中满足存在连接匹配关系的记录&#xff0c;还包括某张表(或两张表)中不满足 匹配关系的记录。交叉连接(cross join):显示两张表所有记录一…...

云工作流 CloudFlow 重磅发布,流程式开发让云上应用构建更简单

云布道师 为了让企业和开发者更快速、便捷地进行云上开发&#xff0c;阿里云重磅发布云工作流&#xff08;CloudFlow&#xff09;&#xff0c;它是一款强大的面向开发者的流程编排开发工具&#xff0c;全托管、高并发、高可用&#xff0c;帮助用户简化和自动化复杂的云上业务流…...

基于单片机GPS轨迹定位和里程统计系统

**单片机设计介绍&#xff0c; 基于单片机GPS轨迹定位和里程统计系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 一个基于单片机、GPS和里程计的轨迹定位和里程统计系统可以被设计成能够在移动的交通工具中精确定位车辆的位置…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...

FOPLP vs CoWoS

以下是 FOPLP&#xff08;Fan-out panel-level packaging 扇出型面板级封装&#xff09;与 CoWoS&#xff08;Chip on Wafer on Substrate&#xff09;两种先进封装技术的详细对比分析&#xff0c;涵盖技术原理、性能、成本、应用场景及市场趋势等维度&#xff1a; 一、技术原…...

深度解析云存储:概念、架构与应用实践

在数据爆炸式增长的时代&#xff0c;传统本地存储因容量限制、管理复杂等问题&#xff0c;已难以满足企业和个人的需求。云存储凭借灵活扩展、便捷访问等特性&#xff0c;成为数据存储领域的主流解决方案。从个人照片备份到企业核心数据管理&#xff0c;云存储正重塑数据存储与…...

Java中HashMap底层原理深度解析:从数据结构到红黑树优化

一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一&#xff0c;是基于哈希表的Map接口非同步实现。它允许使用null键和null值&#xff08;但只能有一个null键&#xff09;&#xff0c;并且不保证映射顺序的恒久不变。与Hashtable相比&#xff0c;Hash…...

职坐标物联网全栈开发全流程解析

物联网全栈开发涵盖从物理设备到上层应用的完整技术链路&#xff0c;其核心流程可归纳为四大模块&#xff1a;感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性&#xff0c;例如传感器选型需平衡精度与…...

若依项目部署--传统架构--未完待续

若依项目介绍 项目源码获取 #Git工具下载 dnf -y install git #若依项目获取 git clone https://gitee.com/y_project/RuoYi-Vue.git项目背景 随着企业信息化需求的增加&#xff0c;传统开发模式存在效率低&#xff0c;重复劳动多等问题。若依项目通过整合主流技术框架&…...