存储过程

基于Simulink的防空导弹六自由度弹道建模与仿真实战 本文详细介绍了基于Simulink的防空导弹六自由度弹道建模与仿真方法。通过分析导弹动力学原理、Simulink环境配置、气动力建模、推进与控制系统设计等关键环节,提供了一套完整的实战指南。文章特别强调了六自由度模型在防空导弹仿真中的重要性,并分享了常见问题排查与优化建议,为相关领域工程师提供实用参考。 阅读详情

在日常开发过程中,接触到存储过程的机会或许不多,通常只需要关注业务逻辑sql就可以很好的完成工作。但在某些情况下,例如报表、数据分析等,使用存储过程,能够简化一系列的复杂sql,执行速度更快(预编译过),出错率低。综合来看,存储过程是我们应该必须掌握的一个技能。

MySQL中存储程序分为存储过程和函数,它们本质上都是存储程序。函数只能通过return来返回结果并且不能使用临时表和某些函数,所以函数使用相对较少,这里只关注存储过程的使用。

初识存储过程

创建存储过程,需要使用CREATE PROCEDURE关键字,语法如下:

CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body

针对语法中的一些内容,总结如下表:

关键词

含义

具体内容

sp_name

存储过程名称

存储过程的名称,操作存储过程时使用。

proc_parameter

参数列表

用于定义存储过程所需参数,有三种参数:IN、OUT、INOUT 。IN表示输入参数;

OUT表示输出参数;

INOUT既可以表示输入参数也可以表示输出参数;

语法为:[IN|OUT|INOUT] param_name type

其中type可以使用mysql所支持的所有类型。

characteristic

指定存储过程的特性

分为以下几种类型:

COMMENT 'string':注释信息;

LANGUAGE SQL:说明routine_body部分是由SQL语句组成;

[NOT] DETERMINISTIC:指明存储过程的结果是否确定。DETERMINISTIC表明存储过程在相同的输入有相同的输出。NOT DETERMINISTIC表明结果是不确定的。默认采用NOT DETERMINISTIC;

{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用SQL语句的限制。CONTAINS SQL表明子程序包含SQL语句,但是不包含读写数据语句。NO SQL表明子程序不包含SQL语句;READS SQL DATA表明子程序包含读数据的语句。 MODIFIES SQL DATA表明子程序包含写数据的语句。默认采用CONTAINS SQL;

SQL SECURITY { DEFINER | INVOKER }:指定存储过程谁有权限执行;DEFINER表明定义者才能执行。INVOKER表示拥有权限的调用者可以执行。默认采用DEFINER;

routing_body

存储过程体

具体的SQL内容,一般使用BEGIN...END来表示执行开始和结束

文字太多,不免有点困意。那就废话少说,开始写我们的第一个存储过程,例:

假设我们现在有一个book表,表结构如下:

CREATE TABLE `book` (
  `BookID` int(5) NOT NULL AUTO_INCREMENT,
  `BookName` varchar(20) NOT NULL,
  `BookAuthor` varchar(20) NOT NULL,
  `BookNumber` int(5) DEFAULT NULL,
  `Comment` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`BookID`)
) ENGINE=InnoDB AUTO_INCREMENT=84 DEFAULT CHARSET=utf8;

假设我们现在想要计算图书的总数,使用存储过程实现如下:

create PROCEDURE BookCount()
BEGIN
    select SUM(BookNumber) from book;
END;

这是一个最简单的存储过程,既没有入参,也没有出参,其中BEGIN和END是用来限制存储过程体。存储过程调用也非常简单,如下:

call BookCount();

使用CALL关键字就能够调用存储过程。

参数的使用

上述根据存储过程的语法就可以看出,使用存储过程是可以带有入参和出参的,方便我们更好的使用。示例如下:

create PROCEDURE BookNumberByBookId(IN id INT,OUT number INT)
BEGIN
    select BookNumber INTO number from book where bookId=id;
END;

其中INTO关键字用来给变量赋值,在调用的时候,还是直接使用call关键字,例如:

call BookNumberByBookId(75,@number);
select @number;

如果想要知道出参的结果,我们可以使用select 出参变量;这里的出参结果通过@number接收。注意必须使用@符号。

变量的使用

在编写存储过程的时候,我们也可以使用变量,变量的作用域是在存储过程体(BEGIN...END)之中。合理的使用变量,可以写出易懂和更加强大的存储过程。

存储过程中使用DECLARE定义变量,语法如下:

DECLARE var_name[,varname]... date_type [DEFAULT value];

var_name:变量名称;date_type 代表数据类型;[DEFAULT value] 用于给变量赋默认值;

例如:DECLARE param1 INT DEFAULT 10;

既然我们能够定义一个变量,那么肯定就能给变量赋值,赋值语法格式如下:

SET var_name=expr [, var_name= expr] ...;

例如:SET param1 = 20;

除此之外,我们还可以通过查询语句赋值,例如:

select k.BookName,k.BookName INTO param1 from book k WHERE k.BookID=1;

流程控制

流程控制语句是用来控制语句的执行,类似于编程语言中的if、while等等。MySQL中的流程控制语句关键字有:IF、CASE、LOOP、LEAVE、ITERATE、REPEAT、WHILE。流程控制是存储过程中的重点,是我们必须掌握的内容。

IF语句

IF语句用来进行条件判断,根据判断的结果为TRUE|FALSE执行相应的语句,示例如下:

IF name = '张三' -- 进行条件判断 (TRUE|FALSE)
	THEN select '张三'; -- 如果TRUE,执行该逻辑
	ELSE select '陌生人';-- 否则,执行该逻辑
END IF;--结束IF语句

CASE语句

CASE也是进行条件判断,本身具备两种格式,示例如下:

-- 第一种格式
CASE name
    WHEN '张三' THEN select '张三';-- 当name=张三,执行该语句
	ELSE select '陌生人';-- 否则执行该条语句
END CASE;
-- 第二种格式
CASE 
    WHEN name='张三' THEN select '张三';
    ELSE select '陌生人';
END CASE;

LOOP、LEAVE语句

LOOP用来循环执行某些语句,不会进行条件判断。LEAVE通常和循环语句结合使用,用来退出循环。

DECLARE number INT DEFAULT 10;
incr_loop:LOOP
	SET number = number+1;
	IF number >=100 THEN LEAVE incr_loop;
	END IF;
END LOOP incr_loop;

REPEAT语句

REPEAT也是开启一个循环,只是它有条件判断,每一次循环都会对条件进行判断。

DECLARE number INT DEFAULT 10;
REPEAT
	SET number = number+1;
UNTIL number >= 100;
END REPEAT;

WHILE语句

它和REPEAT语句类似,也是创建一个带条件的循环,只是它是先判断再循环,而REPEAT语句是先循环再判断。

DECLARE number INT DEFAULT 10;
WHILE number <= 100 DO
    SET number = number+1;
END WHILE;

ITERATE语句

该语句用在循环体内,将语句执行顺序跳转到循环开头。也就是再次循环的意思。

DECLARE number INT DEFAULT 10;
incr_while:WHILE number<=100 DO
	SET number=number+1;
	IF number <= 50 THEN ITERATE incr_while;
	ELSEIF number >= 100 THEN LEAVE incr_while;
	END IF;
END WHILE incr_while;

条件的使用和处理

在存储过程执行的过程中,可能遇到问题或错误,如何处理这些状况,是继续执行下去还是退出,我们可以定义条件和处理逻辑来进行解决。

定义条件的语法:

DECLARE cond_name CONDITION FOR [cond_type]
[cond_type]:
SQLSTATE [VALUE] sqlstate_value | mysql_erroe_code

其中,cond_name代表条件名称;cond_type代表条件类型,其中cond_type分为两种类型:SQLSTATE(sqlstate_value长度为5的字符串错误码) 和 mysql_erroe_code(数值类型错误码);

现在我们定义一个 “ERROR 1148(42000)”错误,应该如何定义呢?如下:

-- 使用SQLSTATE 
DECLARE command_not_allowed CONDITION FOR SQLSTATE '42000';
 -- 使用mysql_error_code 
DECLARE command_not_allowd CONDITION FOR 1148;

我们已经定义好了条件,遇到这些问题如何处理呢?下面我们就来说说如何定义处理程序,语法如下:

DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement

    handler_type : 错误处理方式。分为三种类型:

  • CONTINUE:遇到错误不处理,继续执行;
  • EXIT:遇到错误立即退出;
  • UNDO(MySql暂时不支持):遇到错误撤回之前的操作;

    condition_value代表错误类型,该错误类型有六种取值方式:

  • SQLSTATE [VALUE] sqlstate_value:含有5个字符的字符串错误码;
  • cond_name:定义的条件名称,例如上述 “command_not_allowed”;
  • SQLWARNING:匹配所有以01开头的SQLSTATE错误码;
  • NOT FOUND:匹配所有以02开头的SQLSTATE错误码;
  • MySQL_error_code:匹配数值类型的错误码;
  • SQLEXCEPTION:匹配所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE错误码;

sp_statement表示遇到所需处理的错误时,应该执行的存储过程或函数。

关于处理逻辑,我们也来一个示例,如下:

-- 采用我们上述定义的条件,遇到该条件时,程序退出并输出command_not_allowd信息
DECLARE EXIT HANDLER FOR command_not_allowd SET @info='command_not_allowd';

删除存储过程

在MySql中,如果我们想要修改存储过程的内容,是不能直接做到的。我们只能先删除存储过程,然后重新编写,或者创建新的存储过程。输出示例如下:

drop PROCEDURE IF EXISTS BookCount;

IF EXISTS不是必须的,只是为了防止存储过程不存在抛出错误。IF EXISTS子句可以用来防止错误发生,例如删表,删视图等。

总结

存储过程就是一系列SQL语句的集合,我们可以使用CALL语句调用,另外我们也可以在存储过程语句体中调用其它的存储过程,但不能在其中删除存储过程。另外,我们在使用入参和出参的时候,最好不要与数据表里的字段一样,即使是大小写不一样也不行,否则会出现奇葩的结果,类似出参结果为NULL,大家可以自行尝试。若有不对的地方,望大家不吝赐教,共同进步,谢谢。

 

王道考研操作系统笔记(第一章)附:王道考研408所有PPT和思维导图 学习感想 别人的笔记对你的学习基本上没有用处,容易培养人的惰性,如需ppt和思维导图请拉到最后,有github链接 记笔记并不是一件浪费时间的事情,还有利于多次学习 真心希望大家在学习的过程中记笔记 操作系统 第一章 计算机系统概述 1.1 操作系统 1.1.1 操作系统的概念和功能 概念 操作系统(Operating System, OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基本的系统软 阅读详情

相关推荐

STM32--基于STM32F103C8T6的OV7670摄像头显示

使用 STM32F103C8T6 微控制器驱动 OV7670 摄像头模组,并将图像数据显示在屏幕上,是嵌入式系统中常见的图像采集与显示应用。OV7670 是一款 CMOS VGA 图像传感器,具有高灵敏度、低电压等特点,适用于嵌入式应用。而 STM32F103C8T6 是一款常用的 MCU 控制器,具有丰富的管脚资源和较高的工作频率。

duierrorshuobu的博客 2146

mysql存储过程删除一个表的数据同时将这条数据添加到另一个表中_动态复制一个表中一条数据到另一个表中(列不完全相同)(存储过程实现)...

因为要用到回收站功能,删除一条记录,要先放到一个delete表中,以便以后恢复要求:1、delete表要比被删除表中多三项(用于表明删除用户,删除的是哪种用户表,删除该条数据在该用户表中的id)2、用户表有多张(一个部门一张,但是一个部门又有多个用户,所有设计数据库时,回收站表只设置了一张,因为如果每一部门设置一张delete表,那么有很多跨部门操作,数据库最后终于一个用户的回收站里面记录整理起来...

weixin_28939637的博客 2129

【鸿蒙南向开发】OpenHarmony——分布式数据对象之功能实践

通过本文的学习可了解到分布式数据对象的主要接口、大致调用方法和功能实现等。结合对应内容,可以进一步对分布式数据对象同步机制做深度学习。下一步,(1) 着重理解同步组网的构建原理。(2) 着重理解同步组网内,监听change和status变化的实现。●如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:●关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。

HarmonyOS_666的博客 1092

mysql 存储过程 跳转_mysql存储过程

1、sqlDROP TABLE IF EXISTS `demo`;CREATE TABLE `demo` (`id`int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTR...

weixin_29093169的博客 533

别再到处找了!GWAS数据下载保姆级指南:从IEU、FinnGen到UK Biobank一站搞定

本文提供GWAS数据下载的全面指南,涵盖IEU OpenGWAS、FinnGen、UK Biobank等五大核心数据库的获取策略。从数据库选型到实战操作,详细解析数据搜索、下载、预处理全流程,帮助科研人员高效获取GWAS数据,特别适合初学者快速上手。

weixin_42523543的博客 1586

从透射谱到能量分布:用Rsoft破解光纤光栅耦合模式的3个关键技巧

本文面向光通信工程师与研究者,分享了利用Rsoft软件深入分析光纤光栅耦合模式的三个关键技巧。通过配置场监视器观察XY截面能量分布、利用传播动画追踪动态过程,并结合模式求解器精准判定相位匹配,帮助用户超越透射谱分析,直观可视化能量从纤芯到包层的耦合与流动,从而优化器件设计。

weixin_29290963的博客 422

mysql 存储过程 跳转_mysql如何跳出存储过程的执行 | 学步园

很多小伙伴都知道使用leave label来跳出循环,但是在实际的需求可能需要跳出整个存储过程而mysql又不支持quit,exit或return的方式退出。这里我们依然使用leave的方式来模拟exit的作用(见2)。1,一般用法,跳出循环Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(p1 INT)BEG...

weixin_33162568的博客 930

博途V17 & PLCSIM & FactoryIO 连接教程

PLCSIM V17 和 FactoryIO 连接教程前言一、软件版本二、连接步骤1. 连接PLCSIM2. 博途编程3.连接FactoryIO总结 前言 该文详细讲解了新手入门博途,并通过使用自带PLCSIM和FactoryIO实现连接。 一、软件版本 TIA Portal V17 S7-PLCSIM V17 Factory IO V2.5.1 二、连接步骤 1. 连接PLCSIM 打开PLCSIM 进入项目模式 新建仿真项目 2. 博途编程 将F

soledad_chao的博客 2万+

SQL 存储过程

SQL 存储过程的学习

paoe1612205661的博客 2万+

新凯来嵌入式面经及参考答案

利用编译器预定义宏判断目标架构,如。

大模型大数据攻城狮的专栏 2065

④ Django创建用户中心应用users,扩展用户信息

本章配套视频教程 Django创建用户中心应用users,扩展用户数据 在settings.py文件中配置项目 1、语言配置:LANGUAGE_CODE = 'zh-hans’ 2、时区配置:TIME_ZONE = 'Asia\Shanghai’ 3、模板路径配置:‘DIRS’: [os.path.join(BASE_DIR, ‘templates’)], 并创建templates文件

轻编程的博客 674

什么是存储过程

什么是存储过程:存储过程可以说是一个记录集吧,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。存储过程的好处:1.由于数据库执行动作时,是先编译后执行的。然而存储过程是一个编译过的代码块,所以执行效率要比T-SQL语句高。2.一个存储过程在程序在网络中交互时可以替代大堆...

qq_41786318的博客 3万+

如何在 SAP BTP 上使用 Integration Suite 消费 S/4HANA Cloud API

SAP Integration Suite是一个集成平台即服务(iPaaS),允许开发人员顺利地将内部部署和基于云的应用程序和流程与SAP管理的工具和预构建内容进行集成。登录 SAP Business Technology Platform Cockpit,进入 integration suite:再点击 API management 进入 API Portal:或者直接从收藏夹里打开链接:https://304a49cetrial.integrationsuitetrial-apiportal.cfapp

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1699

Oracle存储过程调用带参的存储过程

Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常。 Oracle存储过程可以有无参数存储过程和带参数存储过程。  一、无参程序过程语法 1 create or replace procedure NoParPro 2 as  ; 3 begin 4 ; 5 exception     //存储过程异常6     ; 7 end; 8          二、带参存储过程

kevinelven的博客 3万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

什么是mysql存储过程_mysql 存储过程

存储过程1.什么是存储过程一组可编程函数,是为了满足特定功能的SQL语句集存储过程就是具有名字的一段代码,用来完成个特定的功能创建的存储过程保存在数据库的数据字典中​2.为什么要用存储过程将重复性很高的操作,封装到一个存储过程中,简化了对这些SQL的调用批量处理统一接口,确保数据安全相对于Oracle来说,Mysql的存储过程相对功能较弱,使用较少​3.存储过程的创建和调用1. delimiter...

weixin_31470259的博客 9127

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

SQL存储过程

1.存储过程的分类: a.系统存储过程的名称-般以"sp_"开头 b.由SQLServer创建、管理和使用 c.存放在Resource数据库中 d.类似C#语言类库中的方法 2.扩展存储过程 a.扩展存储过程的名称通常以"xp_"开头 b.使用编辑语言(如c#)创建的外部存储过程 c.以DLL形式单独存在 3.用户自定义存储过程 a.由用户在自已数据库中创建的存储过程 b.类似C#语言中用户自定义的方法 常用的系统存储过程 系统存储过程 说...

u013934107的博客 2116

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C# 如何创建存储过程以及调用存储过程

选择要创建的数据库,新建查询 ①创建一个没有参数的存储过程 例如我创建一个查询用户帐号和密码的存储过程 CREATE PROC UserProc AS //这个地方as可以省略不写 BEGIN //要写begin、end都要写、要么都不写 SELECT Account,Password FROM [User] END go 创建完成后我们可以在数据库的可编程性-存储过程中看到我们所创建的存储过程。 下面是在sql server 中执行不带参宿的存储过程,我们可以看到执行出来的结果。 执行语句为:

音尘啊 6211

存储过程中可以调用其他存储过程吗_MySQL存储过程详解

MySQL存储过程详解经常有小伙伴问我这个存储过程该如何写?作为过来人我刚开始也有这样的苦恼,今天就给大家说说这个存储过程该如何创建和使用。什么是存储过程存储过程是一组可编程的函数,是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。关键词:可编程,特定功能,调用创建存储过程我们以表customers为例,通过传递客户ID的值来...

weixin_39718006的博客 2215

存储过程返回结果集_存储过程

在开发SQL Server时,为了修改和扩充方便,经常会将负责不同功能的语句集中起来并且按照用途分别独立存储,以便能够反复调用,这些独立存储且拥有不同功能的语句即是“存储过程”。 存储过程属于数据库对象,是一种高效的、安全的访问数据库的方法。主要用于提高数据库中检索数据的速度,也经常被用来访问数据或管理被修改的数据。存储过程包含一些 T-SQL 语句并以特定的名称存储在数...

weixin_28728279的博客 3714

MySQL存储过程详解 mysql 存储过程

mysql存储过程详解 1.存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。 一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做

qq_28807077的博客 2794

存储过程怎么用

  在学习《数据库系统原理》的时候,第五章第一节专门讲的是存储过程。虽然考试顺利通过,但是也仅仅限于理论上的了解,具体应用还是不太明白,直到看过《牛腩新闻发布系统》,这才明白,原来存储过程这么用,接下来就随小编明白明白吧~ 在这里我以SQL Server2017为例,进行叙述 首先,创建存储过程 1、打开SQL Server2017,newssystem(数据库名)-可编程性-存储过程 2、右键...

Jun5203 2252

DB2存储过程

存储过程可以提高程序性能,存储过程创建及运行在数据库服务器上,可以减少数据库存取流量。并且可以帮助集中处理业务逻辑,如果对存储过程进行更改,则使用该存储过程的所有客户机应用都立即可以应用这些更改。存储过程分为外部存储过程和SQL存储过程,SQL存储过程由SQL语句和控制SQL语句组成。SQL存储过程必须用CREATE PROCEDURE语句进行注册。一旦存储过程注册后,在系统索引表中的信息就会独立...

小熊来了 9375
上一篇: SpringBoot与ActiveMQ整合实现手动ACK
下一篇: 设计模式之观察者模式
西红柿丶番茄
博客等级 码龄10年 21粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值