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丨什么是存储过程,在实际项目中用得多么?

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

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

相关文章

小程序订阅消息

wx.requestSubscribeMessage({tmplIds: [2IdqlWrqSbjAurzIuW8imeK-ftS8gbhYdZ0icdE],success(res) {console.log(res);// 处理用户授权结果},fail(err) {console.error(err);// 处理授权请求失败}});

重磅!1区、60年老牌期刊被踢?共5本被剔除!11月SCIE/SSCI期刊目录更新!

期刊动态&#xff1a;2023年11月SCI、SSCI期刊目录更新 2023年11月20日&#xff0c;科睿唯安更新了WOS期刊目录&#xff0c;继上次10月WOS期刊目录剔除7本SCIE&SSCI期刊之后&#xff0c;此次11月更新又有5本期刊发生变动&#xff0c;其中有4本SCIE期刊被剔除&#xff0c;1…

微信运营神器:从群发到批量添加,让你的微信营销更轻松

在这个数字化时代&#xff0c;微信已经成为了我们生活中不可或缺的一部分。对于许多企业和个人来说&#xff0c;微信营销也是非常重要的一部分。但是&#xff0c;微信营销并不是一件容易的事情&#xff0c;需要花费大量的时间和精力。为了解决这个问题&#xff0c;今天我们将向…

Linux本地MinIO存储服务远程调用上传文件

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…

淘宝返利APP草柴如何绑定淘宝账号?

草柴APP是一款淘宝、天猫、京东大额优惠券领取及购物返利省钱工具。通过草柴APP绑定淘宝账号&#xff0c;可领取淘宝大额内部隐藏优惠券&#xff0c;领取成功再购物可享券后价优惠&#xff0c;确认收货后可获得淘宝返利。 淘宝返利APP草柴如何绑定淘宝账号&#xff1f; 1、手…

Docker 快速搭建 Gitlab 服务

linux环境&#xff1a; 使用 vim 编辑 hosts 文件&#xff1a; vim /etc/hosts按 I 进入编辑模式&#xff0c;在文件末行追加上虚拟机的 IP 和要设置的域名&#xff1a; 192.168.1.17 gitlab.kunwu.toplwindows环境&#xff1a; Windows 系统的 hosts 文件位于 C:\Windows\S…

万宾科技智能井盖传感器效果,特点有哪些?

现在城市发展越来越好&#xff0c;对基础设施的改造越来越多&#xff0c;比如修路搭桥、整改生态等都是为民服务的好工程。平时走在路上我们享受着平整的路面&#xff0c;井然有序的交通也为我们带来很大的方便。但是一个又一个的井盖看起来无关紧要&#xff0c;实际上如果路上…

投标文件的注意事项

一、检查标书 1.1有时候标书需要从别的地方复制黏贴文件&#xff0c;记住复制内容可以&#xff0c;但是不要复制“落款和时间”的格式&#xff0c;落款和时间的格式借鉴你的招标文件中给响应文件格式的落款和时间&#xff0c;切记&#xff01; 1.2检查标书是否有空页&#xf…

数据科学导论——数据预处理

第1关:引言-根深之树不怯风折,泉深之水不会涸竭 第2关:数据清理-查漏补缺 import numpy as np import pandas as pd import matplotlib.pyplot as plt def student():train = pd.read_csv(Task1/diabetes_null.csv, na_values=[#NAME?])train[Insulin] = train[Insulin].f…

maxwell采集数据到kafka报错

问题&#xff1a; 启动maxwell后出现数据更新后就出现以下报错。 13:29:14,727 ERROR MaxwellKafkaProducer - TimeoutException Position[BinlogPosition[binlog.000002:12215591], lastHeartbeat1700717043797] -- maxWellData: medical:consultation:[(id,212)] 13:29:14,7…

Raptor安装

Raptor官网:https://raptor.martincarlisle.com/ 进入官网后&#xff0c;下拉找到 Download RAPTOR&#xff0c;windows系统的选择Windows Users 下载完成后打开&#xff0c;选择“next” 修改一下路径&#xff0c;不要放到C: 继续next 完结撒花

vue3的单组件的编写(三)【响应式 API 之 toRef 与 toRefs】

响应式 API 之 toRef 与 toRefs 前面讲了 ref 和 reactive 这两种响应式API &#xff0c;为了方便开发者使用&#xff0c;vue3 还出了两个用来 reactive 转换为 ref 的API&#xff0c;分别是 toRef 和 toRefs 。 &#x1f308;什么是toRef 与 toRefs 这两个API看拼写能猜到&…

css渐变详解(重复性线性渐变、径向渐变、重复性径向渐变的使用)

目录 线性渐变 重复性线性渐变 径向渐变 重复性径向渐变的使用 线性渐变 线性渐变是向下、向上、向左、向右、对角方向的颜色渐变。 其语法格式为&#xff1a; background-image: linear-gradient(side-or-corner|angle, linear-color-stop); 参数说明如下&#xff1a; …

Linux 安装显卡驱动

Linux 安装显卡驱动

scrapy框架流程

1、Scrapy从Spider子类中提取start_url,然后构造为request请求对象 2、将request请求对象传递给爬虫中间件 3、将request请求对象传递给Scrapy引擎&#xff08;核心代码&#xff09; 4、将request请求对象传递给调度器&#xff08;它负责对多个request安排&#xff0c;好比交…

Python计算DICOM图像两点真实距离

Python计算DICOM图像两点真实距离 对比测量结果图Code对比测量结果图 DICOM阅读器(小赛看看)测量结果 python测量结果 Code import numpy as np import cv2 import math import pydicom from pydicom.pixel_data_handlers.util import convert_color_spaceds = pydicom.dc…

高通Camera HAL3: CamX、Chi-CDK要点

目录 一、概述 二、目录 三、CamX组件之前的关系 一、概述 高通CamX架构是高通实现的相机HAL3架构&#xff0c;被各OEM厂商广泛采用。 二、目录 代码位于vendor/qcom/proprietary下&#xff1a; camx&#xff1a;通用功能性接口的代码实现集合chi-cdk&#xff1a;可定制化…

如何正确接入API接口通过淘宝商品ID和sku ID获取到淘宝商品SKU信息接口,可获取sku价格,sku销量,sku图片及sku库存参数等

接入API接口的正确方式可能因API的具体要求而有所不同&#xff0c;但一般来说&#xff0c;以下是一些通用的步骤&#xff1a; 获取API文档&#xff1a;API文档通常包括API的请求方式、请求参数、响应格式等信息。您需要仔细阅读文档&#xff0c;了解API的具体要求和使用方式。…

MDK AC5和AC6是什么?在KEIL5中添加和选择ARMCC版本

前言 看视频有UP主提到“AC5”“AC6”这样的词&#xff0c;一开始有些不理解&#xff0c;原来他说的是ARMCC版本。 keil自带的是ARMCC5&#xff0c;由于ARMCC5已经停止维护了&#xff0c;很多开发者会选择ARMCC6。 在维护公司“成年往事”项目可能就会遇到新KEIL旧版本编译器…

玻色量子“揭秘”之可满足性问题(SAT)与QUBO建模

​ 摘要&#xff1a;布尔可满足性问题&#xff08;Boolean Satisfiability Problem&#xff0c;简称SAT问题&#xff09;是逻辑学和计算机科学中的一个问题&#xff0c;它的目的是确定是否存在一种解释&#xff0c;使给定的布尔公式成立。换句话说&#xff0c;它询问给定布尔公…