如何创建MySQL存储过程,这是一个问题!且看大佬如何整理剖析

简单地说,存储过程就是一条或者多条SQL语句的集合,可视为批文件,但是其作用不仅限于批处理。本篇主要介绍如何创建存储过程和存储函数以及变量的使用,如何调用、查看、修改、删除存储过程和存储函数等。

存储程序可以分为存储过程和函数,MySQL 中创建存储过程和函数使用的语句分别是:CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句来调用存储过程,只能用输出变量返回值。函数可以从语句外调用(即通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。

如何创建MySQL存储过程,这是一个问题!且看大佬如何整理剖析

 

创建存储过程

创建存储过程,需要使用CREATE PROCEDURE语句,基本语法格式如下:

CREATE PROCEDURE sp name ( [ proc parameter])
[ characteristics…] routine_ body

CREATE PROCEDURE为用来创建存储函数的关键字: sp_ _name为存储过程的名称;proc_ parameter 为指定存储过程的参数列表,列表形式如下:

[N1 OUT 1 INOUT] param name type

其中,IN表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出;param_ name表示参数名称; type 表示参数的类型,该类型可以是MySQL数据库中的任意类型。

characteristics指定存储过程的特性,有以下取值:

  • LANGUAGESQL:说明routine_body部分是由SQL语句组成的,当前系统支持的语言为SQL,SQL是LANGUAGE特性的唯一值。
  • [NOT] DETERMINISTIC:指明存储过程执行的结果是否确定。DETERMINISTIC 表示.结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。NOTDETERMINISTIC表示结果是不确定的,相同的输入可能得到不同的输出。如果没有指定任意一个值,默认为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。
  • COMMENT 'string': 注释信息,可以用来描述存储过程或函数。

routine_ body是SQL代码的内容,可以用BEGIN.END来表示SQL代码的开始和结束。编写存储过程并不是件简单的事情,可能存储过程中需要复杂的SQL语句,并且要有创建存储过程的权限;但是使用存储过程将简化操作,减少冗余的操作步骤,同时,还可以减少操作过程中的失误,提高效率,因此存储过程是非常有用的,而且应该尽可能地学会使用。

下面的代码演示了存储过程的内容,名称为AvgFruitPrice,返回所有水果的平均价格,输入代码如下:

CREATE PROCEDURE AvgFruitPrice ()
BEGIN
SELECT AVG(f price) AS avgprice
FROM fruits;
END;

上述代码中,此存储过程名为AvgFruitPrice, 使用CREATE PROCEDURE AvgFruitPrice 0语句定义。此存储过程没有参数,但是后面的0仍然需要。BEGIN和END语句用来限定存储过程体,过程本身仅是一个简单的SELECT语句(AVG为求字段平均值的函数)。

创建查看fruits 表的存储过程,代码如下:

CREATE PROCEDURE Proc()
BEGIN
SELECT * FROM fruits;
END;

这行代码创建了一个查看fruits表的存储过程,每次调用这个存储过程的时候都会执行SELECT语句查看表的内容,代码的执行过程如下:

MySQL> DELIMITER //
MySQL> CREATE PROCEDURE Proc ()
-> BEGIN
-> SELECT ★FROM fruits;
-> END
//
Query OK, 0 rows affected (0.00 sec)
MySQL> DELIMITER ;

这个存储过程和使用SELECT语句查看表的效果得到的结果是一样的,当然存储过程也可以是很多语句的复杂组合,其本身也可以调用其他的函数来组成更加复杂的操作。

“DELIMITER //”语句的作用是将MySQL的结束符设置为//,因为MySQL默认的语句结束符号为分号;’,为了避免与存储过程中SQL语句结束符相冲突,需要使用DELIMITER改变存储过程的结束符,并以“END//" 结束存储过程。存储过程定义完毕之后再使用“DELIMITER;”" 恢复默认结束符。DELIMITER 也可以指定其他符号作为结束符。

创建名称为CountProc的存储过程,代码如下:

CREATE PROCEDURE CountProc (OUT paraml INT)
BEGIN
SELECT COUNT(*) INTO paraml FROM fruits;
END;

上述代码的作用是创建-一个获取fruits 表记录条数的存储过程,名称是CountProc,COUNT(*)计算后把结果放入参数paraml中。代码的执行结果如下:

mysq1> DELIMITER 11
mysql> CREATE PROCEDURE CountProc (OUT param1 INT)
-> BEGIN
-> SELECT COUNT(*) INTO param1 FROM fruits;
-> END //
Query OK, 0 rows affected (0.00 sec)
mysq1> DELIMITER ;

当使用DELIMITER命令时,应该避免使用反斜杠(“\' )字符,因为反斜线是MySQL的转义字符。

创建存储函数

创建存储函数,需要使用CREATE FUNCTION语句,基本语法格式如下:

CREATE FUNCTION func name ( [func_ parameter] )
RETURNS type
[characteristic ...] routine_ body

CREATE FUNCTION为用来创建存储函数的关键字; func_ _name 表示存储函数的名称;func_ parameter 为存储过程的参数列表,参数列表形式如下:

[ INIOUT 1 INOUT ] param name type

其中,IN表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出;param_ name表示参数名称; type 表示参数的类型,该类型可以是MySQL数据库中的任意类型。

RETURNS type 语句表示函数返回数据的类型; characteristic 指定存储函数的特性,取值与创建存储过程时相同,这里不再赘述。

创建存储函数,名称为NameByZip,该函数返回SELECT语句的查询结果,数值类型为字符串型,代码如下:

CREATE FUNCTION NameByZip ()
RETURNS CHAR(50)
RETURN (SELECT s_ name FROM suppliers WHERE S call= 148075') ;

创建一个存储函数, 参数定义为空,返回-一个INT类型的结果。代码的执行结果如下:

mysq1> DELIMITER //
mysql> CREATE FUNCTION NameByZip ()
-> RETURNS CHAR(50)
-> RETURN 设(SELECT s name FROM suppliers WHERE 8 call= 1480755);
-> //
Query OK,0 rows affected (0.12 sec)
mysq1> DELIMITER ;

如果在存储函数中的RETURN语句返回一个类型不同于函数的RETURNS子句中指定类型的值,返回值将被强制为恰当的类型。比如,如果-一个函数返回-一个ENUM或SET值,但是RETURN语句返回一个整数,对于SET成员集的相应的ENUM成员,从函数返回的值是字符串。

指定参数为IN、ouT或INOUT只对PROCEDURE是合法的。(FUNCTION 中总是默认为IN参数)。RETURNS子句只能对FUNCTION做指定,对函数而言这是强制的。它用来指定函数的返回类型,而且函数体必须包含一个RETURN value语句。

变量的使用

变量可以在子程序中声明并使用,这些变量的作用范围是在BEGIN..END程序中,本小节主要介绍如何定义变量和为变量赋值。

1、定义变量

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

DECLARE var name [, varname]. date type [ DEFAULT value] ;

var_ name为局部变量的名称。DEFAULT value子句给变量提供一个默认值。 值除了可以被声明为一个常数之外,还可以被指定为一个表达式。如果没有DEFAULT 子句,初始值为NULL.

定义名称为myparam的变量,类型为INT类型,默认值为100,代码如下:

DECLARE myparam INT DEFAULT 100;

2、为变量赋值

定义变量之后为变量赋值可以改变变量的默认值MySQL中使用SET语句为变量赋值,语法格式如下:

SET var_ name来expr[,var_ name = expr] ....

在存储程序中的SET语句是一-般SET语句的扩展版本。被参考变量可能是子程序内声明的变量,或者是全局服务器变量,如系统变量或者用户变量。

在存储程序中的SET语句作为预先存在的SET语法的一部分来实现。这允许SET a=x,b=y, .这样的扩展语法。其中不同的变量类型(局域声明变量及全局变量)可以被混合起来。这也允许把局部变量和--些只对系统变量有意义的选项合并起来。

声明3个变量,分别为varl、var2 和var3,数据类型为INT,使用SET为变量赋值,代码如下:

DECLARE var1, var2, var3 INT;
SET var1 =10, var2 = 20;
SET var3 =varl+var2;

MySQL中还可以通过SELECT ... INTO为-一个或多个变量赋值,语法如下:

SELECT col name[,...] INTO var name[, ...] table_ expr;

这个SELECT语法把选定的列直接存储到对应位置的变量。col name 表示字段名称;var_ name表示定义的变量名称table_ _expr 表示查询条件表达式包括表名称和WHERE子句。

声明变量fruitname 和fruitprice, 通过SELECT ... INtO语句查询指定记录并为变量赋值,代码如下:

DECLARE fruitname CHAR(50) ;
DECLARE fruitprice DECIMAL(8,2) ;
SELECT f_name, f_price INTO fruitname, fruitprice
FROM fruits WHEREf id ='al' ;

以上就是小编整理的MySQL的创建存储过程,只是小编的个人理解,有哪里不准确的地方,还请大家多多指出,小编和大家一起共同进步~~~

喜欢小编请多多点赞评论分享,关注小编,后续小编会带来更多的内容更新,希望能够帮到大家更好的学习!!!

热门文章

暂无图片
编程学习 ·

IBM分布式深度学习平台FfDL了解

IBM的分布式深度学习平台FfDL(Fabric for Deep Learning) 是用于分布式深度学习模型训练,基于微服务的平台。用户通过提交深度学习作业到已部署FfDL的服务器集群或者云上来进行训练。方便了拥有服务器集群的大型公司或机构进行深度学习硬件资源的调度管理。FfDL会自动调度用户…
暂无图片
编程学习 ·

深度学习在美团推荐平台排序中的运用

美团作为国内最大的生活服务平台,业务种类涉及食、住、行、玩、乐等领域,致力于让大家吃得更好,活得更好,有数亿用户以及丰富的用户行为。随着业务的飞速发展,美团的用户和商户数在快速增长。在这样的背景下,通过对推荐算法的优化,可以更好的给用户提供感兴趣的内容,帮…
暂无图片
编程学习 ·

Embind用于将C ++和JavaScript交互

官方文档EmbindEmbind is used to bind C++ functions and classes to JavaScript, so that the compiled code can be used in a natural way by “normal” JavaScript. Embind also supports calling JavaScript classes from C++.Embind has support for binding most C++ …
暂无图片
编程学习 ·

低功耗蓝牙(BLE)和传感器的使用

一、低功耗蓝牙的使用Android中关于蓝牙的开发文档,可以参考Google提供的官方蓝牙文档:https://developer.android.google.cn/guide/topics/connectivity/bluetooth.html在Android开发中,应用可通过官方提供的蓝牙API执行以下操作:扫描其他蓝牙设备查询本地蓝牙适配器的配对…
暂无图片
编程学习 ·

Tuxera NTFS for Mac在Mac教你快速进行安全传输文件教程

Mac系统在办公性能上更加高效快捷。但是Mac电脑在U盘读取上具有局限性。它并不能读取到NTFS格式的硬盘,那么我们可以用NTFS for Mac这款神器编辑读取。具体的安装步骤 1、双击下载好的安装包(.dmg)文件,会跳出安装会话框,点击"Install Tuxera NTFS"开始安装软件…
暂无图片
编程学习 ·

MySQL基础(十二):锁机制

文章目录一、锁的概述1、什么是锁?2、锁的分类二、MySQL中的三种锁1、表锁(偏读)(1)表锁的特点(2)表加读锁、写锁的语法(3)读锁特性实验(4)写锁特性实验(3)结论2、行锁(偏写)(1) 由于行锁支持事务,复习老知识(2)建表sql(3)行锁加读锁、写锁语法(4)读锁…
暂无图片
编程学习 ·

51小项目——使用proteus搭建简易的光照度计-(1)

总述 本项目基于51单片机,实现了对光敏电阻两端电压信号的简单获取,并通过数码管显示,蜂鸣器可以根据电压信号的大小发出不同间隔的声音。 注意: 由于疫情原因限制,无法返校制作实物,故本项目仅在proteus中完成了仿真,未能完成实物制作,仿真结果可能与实物结果不符 介绍…
暂无图片
编程学习 ·

数据表的规范

数据库的设计范式 六种范式 1. 第一范式 2. 第二范式 3. 第三范式 4. BCNF 巴斯-科德范式 5. 第四范式 6. 第五范式 完美范式 * 范式设计越高阶,冗余度越低。数据表中的键 1. 超键: 能唯一标识元组的属性集叫超键 2. 候选键:如果超键不包括多余的属性,这个超键就是候选键 …
暂无图片
编程学习 ·

Linux系统编程4:IPC消息队列

Linux系统编程4:IPC消息队列0. 消息队列1. POSIX 消息队列1.1 查看1.2 接口1.3 结构体1.4 函数1.4.1 创建消息队列1.4.2 删除消息队列1.4.3 打开消息队列1.4.4 关闭消息队列1.4.5 发送消息1.4.6 接收消息1.4.7 设置消息队列属性1.4.8 获取消息队列属性 0. 消息队列背景 管道和…
暂无图片
编程学习 ·

LeetCode题解(0788):进制转换的奇技淫巧

题目 我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后,我们仍可以得到一个有效的,且和 X 不同的数。要求每位数字都要被旋转。 如果一个数的每位数字被旋转以后仍然还是一个数字, 则这个数是有效的。0, 1, 和 8 被旋转后仍然是它们自己;2 和 5 可以互相旋转…
暂无图片
编程学习 ·

SpringCloud 整合 zookeeper 学习

SpringCloud 整合 zookeeper 学习 支付微服务注册zookeeper创建支付微服务 - cloud-provider-payment8004 pom.xml<dependencies><!--自定义的api--><dependency><groupId>org.huiyuanai</groupId><artifactId>cloud-api-common</artif…
暂无图片
编程学习 ·

java面试-JVM内存区域划分

JVM内存划分说到Java内存区域,刚开始接触java的人会下意识说出“堆栈”。这里要明确堆栈不是一个概念,而是两个概念,堆和栈是两块不同的内存区域,简单理解的话,堆是用来存放对象而栈是用来执行程序的。其次,堆内存和栈内存的这种划分方式比较粗糙,这种划分方式只能说明大…
暂无图片
编程学习 ·

simulink模型延时

simulink模型如果输入与输出有联系形成回路你需要做的就是加一个延时,并且注意是连续的还是离散的
暂无图片
编程学习 ·

软件测试(软件测试生命周期,描述一个bug,定义bug级别,bug生命周期,如何开始第一次测试,测试执行和bug管理,测试工作中的人际关系处理)

一、软件测试的生命周期 对比软件的生命周期和bug的生命周期 软件的生命周期:需求分析——计划——设计——编码——测试——运行维护 软件测试的生命周期:需求分析——测试计划——测试设计、测试开发——测试执行——测试评估 bug的生命周期: 软件测试&软件开发生…
暂无图片
编程学习 ·

一个很小的错误,找半天,说明测试的话要完整测试.

如(d==.){//只能有1个点点数++;右();如(点数==1)下;打印("点数不对");置(m);中 0;}//不支持什么科学计数,这里就死循环了.就这么一块,少写了一个右().找半天.假设以后有时间写测试的话,一定要测试完整.将每个函数都测试到. 这样不会出错. 完整测试,不仅仅包括函数的完…