MySQL中的存储过程与存储函数

Mysql中的存储过程和存储函数及游标和触发器 什么是存储过程 简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法; 存储过程的好处 1、简化操作,提高了sql语句的重用性,减少了开发程序员的压力 2、减少操作过程中的失误,提高效率 3、减少网络传输量(客户端不需要把所有的SQL语句通过网络发给服务器) 4、减少了SQL语句暴露在网上的风险,也提高了数据查询的安全性 创建存储过程 Delimiter $ create procedure 存储过程名(参数模式 参数... 阅读详情

刚开始接触存储过程和存储函数的时候可能会产生误解,这里的“存储”并不是指这种语句是数据库用来存储数据的,“存储”的真正含义是存储预编译的语句,可以简单地把它理解成类似其他编程语言里的函数。

  • 存储过程:存储过程就是提前编译好的一段sql语言,放置在数据库端,可以直接被调用,这一段sql一般都是固定步骤的业务。
  • 存储函数:在存储过程的基础上加上返回值。

MySQL中的存储过程和存储函数跟Oracle中的原理相同,语法也几乎一样,只有细微的差别,但他们的参数列表还是有较大差异的。

1. 存储过程

创建语法
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
    存储过程体(组合的SQL语句);
END;

可以看出其创建语法跟Oracle略有区别,其所有的操作必须在begin..end之间,包括定义变量,而且没有create or replace这种写法,必须先删除再创建;还有一点,declare声明变量必须在存储过程的最开始,否则就会出错。

这里插播一个小知识,我们知道 ; 默认是语句的结束,当我们在dos界面输入一个很长的存储过程或者存储函数时,其内部必然含有大量 ; ,当我们enter后会自动编译,我们不希望这样,我们想要的是同时编译一段语句,这个怎么做到哪?我们可以将本来默认的;改为别的符号,语法为:

DELIMITER $$   -- 自定义的符号,不要加分号

所以上面我们可以改成,delimiter的作用范围为当前会话,可以理解成当前的.sql文件:

DELIMITER $$ 
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
    存储过程体(组合的SQL语句);
END $$
调用语法
CALL 存储过程名(参数列表);

这个跟oracle也不一样,需要加CALL关键字。

删除语法
DROP PROCEDURE 存储过程名;
查看创建信息
SHOW CREATE PROCEDURE 存储过程名;

2. in、out、in out参数

用法跟oracle中有很大差异,这里的参数跟普通编程语言里比较相似,不像Oracle那么严格。

  • in:用于接收参数,将参数传入存储过程或存储函数内部后也可以进行修改,但是不建议,因为这样没有任何意义,这类似于c语言中的形参,在存储过程或者函数内部修改形参并不会改变外部传入参数的值,默认的参数模式为in;例如下面允许修改input(在Oracle中这种行为是非法的)但这样做没有任何意义:
-- in参数
DELIMITER $$
CREATE PROCEDURE p1(IN input INT)
BEGIN
	SET input=5; -- 可以改变input
	SELECT input;
END $$
-- 测试
SET @n=1;
SELECT @n;  -- 输出1
CALL p1(@n);
SELECT @n;  -- 输出还是1,并没有改变外部的变量
  • out:用于修改参数,必须先在外部定义变量(一般不赋值),然后传入存储过程或存储函数内部进行修改,存储过程或存储函数并不care在外部有没有赋值,即使有赋值也会忽略掉(清零赋值为null),可以理解成你传入output但不对它进行赋值,这样做没有意义,那么MySQL会自动赋值为null,例如:
-- 带out参数的存储过程,赋值
DELIMITER $$
CREATE PROCEDURE p2(OUT output INT)
BEGIN
	SET output=10;
	SELECT output;
END $$
-- 测试
SET @num=1;
SELECT @num;  -- 输出1
CALL p2(@num);
SELECT @num;  -- 输出10,改变了外部的变量

-- 带out参数的存储过程,不赋值,忽略(清空)传入的值
DELIMITER $$
CREATE PROCEDURE p3(OUT output INT)
BEGIN
	SELECT output;  -- 清空,输出null
END $$
-- 测试
SET @num=1;
SELECT @num;   -- 输出1
CALL p3(@num); -- 输出null
SELECT @num;   -- 输出null,改变了外部变量!!!赋值为null

  • inout:既要用于接收参数,又要用于修改参数,既能干in的事又能干out的事,这里的in out才是真正类似于C语言中的函数参数传入地址,总结起来就是既能像in读入参数的值(out读不了,会清零为null),又能对外部变量赋值(in干不了,只能读值),例如:
-- 带in out参数的存储过程
DELIMITER $$
CREATE PROCEDURE p4(INOUT in_output_a INT, INOUT in_output_b INT)
BEGIN
	SELECT in_output_a, in_output_b;  -- 输出1, 2
	SET in_output_a=in_output_a*2;
	SET in_output_b=in_output_b*2;
END $$
-- 测试
SET @a=1;
SET @b=2;
SELECT @a, @b;    -- 输出1, 2
CALL p4(@a, @b);  -- 输出1, 2; 说明读入了
SELECT @a, @b;    -- 输出2, 4; 说明改变了外部的变量

3. 存储函数

创建语法
DELIMITER $$ 
CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN
    函数体(一般步骤为:
                先定义返回值,
                再为返回值赋值,
                最后返回);
END $$

注意这里的returns跟oracle中的不同,要加个s哦。

调用语法
SELECT 函数名(参数列表);

这里的意思是执行函数,并返回值,可以定义变量接收?

删除语法
DROP FUNCTION 函数名;
查看创建信息
SHOW CREATE FUNCTION 函数名;

我之所以在前面讲参数,是因为Oracle和MySQL中的存储函数有很大不同,MySQL中的存储函数是没有in、out、inout参数区分的,可以把它的参数看做默认是且必须是in类型的。

而且还有一点需要注意的是存储函数只能有一个返回值,而且在存储函数内部是不允许使用select 变量名;这种格式打印返回值的。

-- 存储函数
DELIMITER $$
CREATE FUNCTION f3(a INT, b INT) RETURNS INT
BEGIN
	DECLARE SUM INT DEFAULT 0;
	SET SUM=a+b;
	-- select sum; -- 这样写是非法的
	RETURN SUM;
END $$
-- 测试
SET @a=5;
SET @b=5;
SELECT f3(@a, @b); -- 输出10
MySQL中的存储过程和函数 总结起来,存储过程和函数是MySQL中强大而灵活的工具,可以用于执行复杂的数据库操作和计算。通过熟练掌握存储过程和函数的使用,我们可以更好地利用MySQL数据库的功能来满足各种业务需求。存储过程用于执行一系列的SQL语句,并可以接受输入参数和返回输出参数。它们是预定义的、可重复使用的代码块,可以通过简单调用来执行复杂的操作。存储过程和函数的主要区别在于它们的用途和返回值。函数可以在SQL查询中使用,也可以作为表达式的一部分使用。语句调用存储过程,并通过提供参数来调用带有输入参数的存储过程。 阅读详情

相关推荐

存储过程和函数在MariaDB/MySQL中的使用

存储过程和函数是MariaDB/MySQL中强大的特性,它们可以将一系列SQL语句打包成可重复使用的代码块,并提供参数输入和结果输出的功能。存储过程和函数是MariaDB/MySQL数据库中强大且常用的特性,它们允许开发人员将一系列SQL语句打包成可重复使用的代码块。本文将详细介绍MariaDB/MySQL中存储过程和函数的概念、语法和用法,并提供相应的源代码示例。函数是一种特殊的存储过程,它们接受输入参数并返回一个值。是一个用户定义的变量,用于接收存储过程的输出结果。是函数的名称,它接受两个输入参数。

SmufHtml的博客 269

MySQL存储过程

目录 一、存储过程 1.1什么是存储过程 1.2存储过程的优缺点 二、创建存储过程 2.1语法与特性: 2.2声明语句分隔符 2.3过程体的标识 2.4存储过程参数设置 三、存储过程中的变量 四、MySQL变量 五、设置用户执行存储过程的权限 六、查看存储过程的状态 七、查看存储过程的创建代码 八、修改存储过程 九、删除存储过程 十、存储过程的控制语句 十一、IF-ELSEIF-ELSE条件语句 十二、CASE条件语句 十三、WHILE循环语句 十四、LOOP循环语句

ReincarnationArm的博客 2万+

HID报告描述符实战解析:从Usage到Item的完整设计流程

本文深入解析了HID报告描述符的设计流程,从核心概念Usage(用途定义)入手,详细阐述了如何通过Item(条目)的三种角色——全局、局部与主干,构建出能被系统正确识别的设备“说明书”。文章以标准USB鼠标和键盘为例进行实战拆解,并介绍了使用Report ID与自定义设备等进阶设计方法,帮助开发者掌握这一实现USB设备即插即用的关键技术。

weixin_29230865的博客 282

该如何使用MySQL的存储过程?

存储过程的参数类型可以是IN、OUT和INOUT。根据这点分类如下: 1、没有参数(无参数无返回) 2、仅仅带 IN 类型(有参数无返回) 3、仅仅带OUT 类型(无参数有返回) 4、既带 IN 又带 OUT(有参数有返回) 5、带INOUT(有参数有返回) 注意: IN、OUT、INOUT 都可以在一个存储过程中带多个。 2、创建存储过程 语法: CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参..

知识记录 2万+

Sobel原理及计算过程详解

该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。首先,我们需要构建一个Sobel算子,通常是一个 3x3 的矩阵。Sobel算子可以分别计算水平和垂直方向的梯度值,然后将两者合并得到总梯度值。索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度近似值。所以,我们假设选择图像矩阵中的点A(1, 1),即第二行第二列的元素,对应的。接下来,我们将使用Sobel算子计算这个点的梯度值。

2301_76461741的博客 1万+

NE5532A与JRC4580在低噪声音频电路设计中的关键应用

本文深入探讨了经典运算放大器NE5532A与JRC4580在低噪声音频电路设计中的核心应用。文章从噪声模型分析入手,阐述了针对低阻抗信号源时,如何利用这两款BJT输入运放的低电流噪声特性进行优化设计。通过对比两者参数与实战守则,为设计高保真音频前级、耳机放大等电路提供了从原理图到PCB布局的完整低噪声解决方案。

weixin_29295541的博客 327

[MySQL]存储过程与函数

1. 存储过程概述2. 创建存储过程3. 调用存储过程4. 存储过程的调试 5. 存储函数6. 存储函数和存储过程的对比 7. 存储过程和函数的查看、修改、删除 7.1 查看 7.1.1 SHOW CREATE 7.1.2 SHOW STATUS 7.1.3 information_schema.Routines表中查看存储过程和函数的信息 7.2 修改 7.3 删除 8. 存储过程与函数的优缺点 5.1 存储函数语法 5.2 调用存储函数

emmmm..... 2996

windows10下 iperf3测试带宽

客户端输入:"iperf3.exe -u -c 服务器IP地址 -b 5g" //客户端给服务器发送udp数据包,最大带宽为5g。客户端输入:“iperf3.exe -c 服务器IP地址 -P 10“//表示客户端10路并行给服务器发送TCP包;上图可知:带宽是15Gbps(这里不知道为什么下面测试的UDP会比这里TCP慢 按道理UDP不可能比TCP慢的5.)3. 验证是否下载成功,在打开的窗口中输入“iperf3.exe -v”,会出现安装的版本,表示安装成功了。5. iperf3参数。

xiaoqixiaoguai的博客 5889

MySQL中的存储过程(详细篇)

概述 由MySQL5.0 版本开始支持存储过程。 如果在实现用户的某些需求时,需要编写一组复杂的SQL语句才能实现的时候,那么我们就可以将这组复杂的SQL语句集提前编写在数据库中,由JDBC调用来执行这组SQL语句。把编写在数据库中的SQL语句集称为存储过程。 存储过程:(PROCEDURE)是事先经过编译并存储在数据库中的一段SQL语句的集合。调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是很有好处的。 就是数据库 SQL 语言层面的代码封装与.

古城的博客 13万+

从零到一:Livox Mid-360 激光雷达的硬件集成与避坑实战

本文详细介绍了Livox Mid-360激光雷达的硬件集成全流程,包括硬件准备、网络配置、驱动编译和常见问题解决方案。通过实战经验,帮助开发者高效完成从设备拆箱到数据输出的完整链路,避免在IP设置、驱动编译和固件兼容性等环节踩坑。

salt的博客 1028

在MCUXpresso上通过J-link烧写KW45

背景: KW45B是nxp 的ble npi产品,其使用的IDE为MCUXpressso或者IAR,MCUXpressso有一些bug,但是由于MCUXpressso阅读查找代码相对IAR容易,所以我经常使用的MCUXpressso进行开发。当然IAR也有其优势,比如编译、烧写速度相对MCUXpressso更快,是比较通用的一个平台,而MCUXpressso是NXP独有的。 Kw45有两种烧写方式,一是使用MCUlink,二是使用Jlink。NXP ble 产品线提供的IDE资料里有最新的15.0版本的

weixin_41889258的博客 2859

Mysql-存储过程&存储函数

1、MySQL 存储过程是一种在 MySQL 数据库中存储的预编译 SQL 代码块,它可以接受参数并执行一系列 SQL 操作。2、存储过程通常用于封装和重用复杂的 SQL 逻辑,从而简化应用程序的代码,提升性能,并提供更高的安全性。3、减少数据在数据库和应用服务器之间的传输,提高数据处理的效率。4、存储过程没有返回值,但可以通过 OUT 参数来获取。优点:代码复用:存储过程允许重复使用相同的 SQL 逻辑,减少代码冗余。性能优化。

sunhaihan99的博客 2339

Rancher入门到精通 - Nginx Ingress 配置指南

Rancher 是一个开源的容器管理平台,它提供了一套完整且易于使用的工具来部署、管理和扩展容器化应用。而 Nginx Ingress 则是一个常用的开源 Ingress 控制器,用于将外部请求流量导入到 Kubernetes 集群中的服务。在开始之前,请确保您已经正确安装了 Rancher 平台和 Nginx Ingress 控制器。

TechInk的博客 1311

详细介绍mysql中的存储过程与函数

其实存储过程和函数在实际开发中很重要,比如创建定时任务,实现转码等情况是都用到存储过程和函数。但是实际开发中不提倡复杂的业务逻辑写在存储过程中,因它调式很困难。

guye 1266

无人机导航中的坐标系统详解与转换实现

本文系统介绍了无人机导航中常用的坐标系及其转换方法。主要内容包括:1) 四种关键坐标系(大地坐标系ECEF、经纬度LLA、北东天坐标系NED、机体坐标系)的定义和特点;2) 坐标系间的转换原理与实现,重点讲解LLA与ECEF的互转公式及ECEF与NED的转换方法;3) 提供可直接使用的C++实现代码,包括基于WGS84椭球模型的精确转换算法。这些内容为无人机导航系统开发提供了实用的坐标系处理方案,能够有效解决多源数据在不同坐标系下的统一表示问题。

电脑管家 375

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

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

【进阶篇第五弹】《详解存储过程》从0掌握MySQL中的存储过程以及存储函数

本文围绕存储过程展开详细阐述,先介绍其概念,即事先编译并存储在数据库中的 SQL 语句集合,具有封装复用、可传参返数据、提升效率等特点。接着讲解基本语法,包括创建、调用、查看、删除存储过程,以及设置结束符和参数类型(in、out、inout)的用法。还介绍了系统变量、用户自定义变量、局部变量的查看与设置,以及 if 判断、case、while 循环、repeat、loop 循环等基本语句。此外,说明了游标(声明、打开、获取、关闭)和条件处理程序的使用,最后提及存储函数,它是有返回值的存储过程

pbrush的博客 1454

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

MySQL中的存储过程、游标和存储函数

MySQL中的存储过程首先来看两个问题: 1.什么是存储过程? 存储过程(Stored Procedure)是在数据库系统中,一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程有参数的话)来执行它。 2.为什么要使用存储过程? 《MySQL必知必会》这本书中给出了如下几条主要理由: 1)通过把处理封装在容易使用的单元中,简化复...

weixin_30795127的博客 174

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

WINCC7.3破解文件

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

mysql 触发器存储过程的区别_MySQL中的存储过程、函数与触发器

一.对待存储过程和函数的态度优点:1.存储过程只在创建时进行编译,sql语句则每次执行都需要编译。能提高数据库执行速度。2.简单复杂操作结合事物一起封装。3.复用性高。4.安全性高,可指定存储过程的使用权。在实际项目中应该尽量少用存储过程和函数,理由如下:1.移植性差,在MySQL中的存储过程移植到sqlsever上就不一定可以用了。2.调试麻烦,在db中报一个错误和在应用层报一个错误不是一个概念...

weixin_39702400的博客 235

mysql 中的存储过程和自定义函数

set @x=2;结果调用存储过程调用用户变量beginset @x=1;set @x=2;结果:调用存储过程调用用户变量使用光标在存储过程中可以使用光标对结果集进行循环处理。SET @x2=0;#查看结果test1表结构及数据test1表数据结果查询结果使用流程控制。

2501_92608043的博客 734

MySQL自定义函数与存储过程_MySQL 中的自定义函数和存储过程 简单实例

需要说明的是:MySQL中没有表变量, 一般是通过临时表来存贮结果集的。那么 我们如何取出在储存过程中select出来的结果集呢?如果是其它存储过程中,你可以使用生成的临时表。如果是java程序中,你可以直接象执行select*fromaa一样调用callxxx();的结果--MySQL 中的函数-- 函数 返回int类型DELIMITER $$DROP FUNCTION IF EXIS...

weixin_39673704的博客 123

MySQL高级篇——存储过程和函数中的变量

如果是全局级别,则需要加GLOBAL,如果是会话级别,则需要加SESSION,如果不写,则默认SESSION。局部变量 BEGIN END中 只能在BEGIN END中,且为第一句话 一般不用加@符号,需要限定类型。作用域:服务器每次启动将为所有的全局变量赋初始值,针对于所有的会话(连接)有效,但不能跨重启。select @@global | 【session】.系统变量名;用户变量 当前会话 会话中的任何地方 必须加@符号,不用限定类型。作用域:针对于当前会话(连接)有效,同于会话变量的作用域。

zl5186888的博客 419

mysql中的函数与存储过程

mysql中的函数:1 mysql下创建函数: 1.1 语法: delimiter $$ -- 设置分隔符,默认是; 设置成其他符号,让编译器知道我们函数编写的结束,此处设置成$$ create function 函数名(参数列表) returns 返回值类型 begin 函数语句 end $$ -- 表示结束 delimiter ; ...

稀里糊涂林老冷 157

MySQL中的变量、存储过程、自定义函数

变量 系统变量 全局变量、会话变量 查看系统变量: show variables 自定义变量 包括用户变量与局部变量 变量是用户定义的,不是由系统定义 使用步骤: 声明 赋值 使用 用户变量 用户变量: 针对于当前连接,等同于会话变量的作用域 声明并初始化 set @用户变量名 = 值 set @用户变量名 :=值 select !@用户变量名 :=值 更新用户变量值 方式一: set @用户变量名 = 值 set @用户变量名 :=值 select !@用户变量名 :

m0_52761033的博客 231
上一篇: MySQL中的变量
下一篇: Vim入门操作大全
saltedfishust
博客等级 码龄9年 27粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值