@select 怎么写存储过程_MySQL4:存储过程和函数

什么是存储过程

简单说,存储过程就是一条或多条SQL语句的集合,可视为批文件,但是起作用不仅限于批处理。本文主要讲解如何创建存储过程和存储函数以及变量的使用,如何调用、查看、修改、删除存储过程和存储函数等。使用的数据库和表还是之前写JDBC用的数据库和表:

create database school;use school;create table student( studentId int primary key auto_increment not null, studentName varchar(10) not null, studentAge int, studentPhone varchar(15))insert into student values(null,'Betty', '20', '00000000');insert into student values(null,'Jerry', '18', '11111111');insert into student values(null,'Betty', '21', '22222222');insert into student values(null,'Steve', '27', '33333333');insert into student values(null,'James', '22', '44444444');commit;

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

创建存储过程

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

CREATE PROCEDURE sp_name([proc_parameter]) [characteristics ...] routine_body

解释一下:

1、CREATE PROCEDURE为创建存储过程的关键字

2、sp_name为存储过程的名字

3、proc_parameter为指定存储过程的参数列表,列表形式为[IN|OUT|INOUT] param_name type。其中,IN表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出,param_name表示参数名称,type表示参数类型,该类型可以是MySQL数据库中的任意类型

4、characteristics指定存储过程的特性

5、routime_body是SQL代码的内容,可以用BEGIN...END来表示SQL代码的开始和结束

编写存储过程不是简单的事情,可能存储过程中需要复杂的SQL语句,并且要有创建存储过程的权限;但是使用存储过程将简化操作,减少冗余的操作步骤,同时还可以减少操作过程中的事物,提高效率,因此存储过程是非常有用的。下面看两个存储过程,一个查询student表中的所有字段,一个根据student表的Age字段算一个Age的平均值:

CREATE PROCEDURE proc ()BEGIN SELECT * FROM student;END;CREATE PROCEDURE AvgStudentAge()BEGIN SELECT AVG(studentAge) AS avgAge FROM student;END;

上面都是不带参数的存储过程,下面看一个带参数的存储过程:

DELIMITER //CREATE PROCEDURE CountStudent(IN sName VARCHAR(10), OUT num INT)BEGIN SELECT COUNT(*) INTO num FROM student WHERE studentName = sName;END //

上述代码的作用是创建一个获取student表记录条数的存储过程,名称为CountStudent,根据传入的学生姓名COUNT(*)后把结果放入参数num中。

注意另外一个细节,上述代码第一行使用了"DELIMITER //",这句语句的作用是把MySQL的结束符设置为"//",因为MySQL默认的语句结束符号为分号";",为了避免与存储过程中SQL语句结束符相冲突,需要使用DELIMITER改变存储过程的结束符,并以"END //"结束存储过程。存过程定义完毕之后再使用"DELIMITER ;"恢复默认结束符。DELIMITER也可以指定其他符号作为结束符。

创建存储函数

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

CREATE FUNCTION func_name([func_parameter]) RETURNS type[characteristic ...] routine_body

解释一下:

1、CREATE_FUNCTION为用来创建存储函数的关键字

2、func_name表示存储函数的名称

3、func_parameter为存储过程的参数列表,参数列表形式为[IN|OUT|INOUT] param_name type,和存储过程一样

4、RETURNS type表示函数返回数据的类型

5、characteristic表示存储函数的特性,和存储过程一样

举个例子:

CREATE FUNCTION NameByZip() RETURNS CHAR(50)RETURN (select studentPhone from student where studentName = 'JAMES');

提两点:

1、如果在存储函数中的RETURN语句返回一个类型不同于函数的RETURNS自居指定的类型的值,返回值将被强制为恰当的类型

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

变量的使用

变量可以在子程序中声明并使用,这些变量的作用范围是在BEGIN...END程序中,在存储过程中可以使用DECLARE语句定义变量,语法如下:

DECLARE var_name[,varame]... date_type [DEFAULT value]

解释一下:

1、var_name为局部变量的名称

2、DEFAULT value子句给变量提供一个默认值,值除了可以被声明为一个常数之外,还可以被指定为一个表达式。如果没有DEFAULT子句,那么初始值为NULL

定义变量后,为变量赋值可以改变变量的默认值,MySQL使用SET为变量赋值:

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

举个例子:

DECLARE var1 INT DEFAULT 100;DECLARE var2, var3, var4 INT;SET var2 = 10, var3 = 20;SET var4 = var2 + var3;

当然,我们使用SELECT语句也可以给变量赋值:

DECLARE t_studentName CHAR(20);DECLARE t_studentAge INT;SELECT studentName, studentId INTO t_studentName, t_studentAge FROM student where studentName = 'Bruce';DECLARE t_studentName CHAR(20);DECLARE t_studentAge INT;

游标的使用

查询语句可能返回多条记录,如果数据量非常大,需要在存储过程和存储函数中使用游标来逐条读取查询结果集中的记录。应用程序可以根据需要滚动或浏览器中的程序。

游标必须在处理程序之前被声明,并且变量和条件还必须在声明游标或处理程序之前被声明。MySQL中声明游标的方法为:

DECLARE cursor_name CURSOR FOR select_statement

解释一下:

1、cursor_name表示游标的名称

2、select_statement表示SELECT语句返回的内容,返回一个用于创建游标的结果集

定义了游标,就要打开游标,打开游标的方法为:

OPEN cursor_name{游标名称}

再就是使用游标了,使用游标的方法为:

FETCH cursor_name INTO var_name [, var_name] ... {参数名称}

最后游标使用完了,要关闭:

CLOSE cursor_name{游标名称}

举个例子:

DECLARE t_studentName CHAR(20);DECLARE t_studentAge INT;DECLARE cur_student CURSOR FOR SELECT studentName, studentId FROM student where studentName = 'Bruce';OPEN cur_student;FETCH cur_student INTO t_studentName, t_studentAge;...CLOSE cur_student;

studentName为Bruce的在数据里面不止一条记录,创建游标之后就从student表中查出了studentName和studentId的值。OPEN这个游标,通过FETCH之后遍历每一组studentName和studentAge,并放入申明的变量t_studentName和t_studentAge中,之后想怎么用这两个字段怎么用这两个字段了。注意,游标用完关闭掉。

IF、CASE、LOOP、LEAVE、ITERATE、REPEAT

这六个比较简单,放在一起讲了,简单说下用法,除了第一个IF写个例子以外,别的就不写例子了,可以自己尝试下。

1、IF

IF语句包含多个判断条件,根据判断的结果为TRUE或FALSE执行相应的语句,其格式为:

IF expr_condition THEN statement_list [ELSEIF expr_condition THEN statement_list] [ELSE statement_list] END IF

比如:

IF t_studentName IS NULL THEN SELECT studentName INTO t_studentName FROM student where studentName = 'Bruce'; ELSE UPDATE studentName set student = NULL where studentName = 'Bruce';END IF;

2、CASE

case是另外一个进行条件判断的语句,该语句有两种格式,第一种格式如下:

CASE case_expr WHEN when_value THEN statement_list [WHEN when_value THEN statement_list] ... [ELSE statement_list]END CASE

其中,case_expr参数表示判断的表达式,决定了哪一个WHEN自居会被执行;when_value表示表达式可能的值,如果某个when_value表达式与case_expr表达式结果相同,则执行对应THEN关键字后的statement_list中的语句;statement_list参数表示不同when_value值的执行语句。

CASE语句的第二种格式为:

CASE WHEN expr_condition THEN statement_list [WHEN expr_condition THEN statement_list] ... [ElSE statement_list]END CASE

只是写法稍微变了一下,参数还是第一种写法的意思

3、LOOP

LOOP循环用来重复执行某些语句,与IF和CASE相比,LOOP只是创建一个循环操作的过程,并不进行条件判断。LOOP内的语句一直被重复执行直到循环被退出,跳出循环过程,使用LEAVE子句。LOOP语句j的基本格式如下:

[loop_label:] LOOP statement_listEND LOOP

其中loop_label表示LOOP语句的标注名称,该参数可以省略;statement_list参数表示需要循环执行的语句

4、LEAVE

LEAVE语句用来退出任何被标注的流程控制构造,LEAVE语句的基本格式如下:

LEAVE label

5、ITERATE

ITERATE语句将执行顺序转到语句段开头出,语句基本格式如下:

ITERATE label

6、REPEAT

REPEAT语句用来创建一个带有条件判断的循环过程,每次与局执行完毕之后,会对条件表达式进行判断,如果表达式为真,则循环结束,否则重复执行循环中的语句。REPEAT语句的基本格式如下:

[repeat_label:] REPEAT statement_listUNTIL expr_conditionEND REPEAT

其中,repeat_label为REPEAT语句的标注名称,该参数可以省略;REPEAT语句内的语句或语句群被重复,直至expr_condition为真

调用存储过程和函数

存储过程已经定义好了,接下来无非就是调用。存储过程和函数有很多种调用方法,存储过程必须使用CALL语句调用,并且存储过程和数据库相关,如果要执行其他数据库中的存储过程,需要指定数据库名称,例如CALL dbname.procname。存储函数的调用与MySQL中预定义的函数调用方式相同。

1、调用存储过程

存储过程是通过CALL语句进行调用的,语法如下:

CALL sp_name([parameter[,...]])

举个例子,就调用最前面那个CountStudent的存储过程:

CALL CountStudent('Bruce', @num);select @num;

运行结果为:

2bf47eaa0c8e7a5d58e9edd53adb5968.png

2、调用存储函数

MySQL中调用存储函数的使用方法和MySQL内部函数的使用方法是一样的,无非存储函数是用户自己定义的,内部函数是MySQL开发者定义的。

我们调用一下上面定义的NameByZip那个函数:

select NameByZip();

运行结果为:

524ae778bb22950f974051e89f4685bc.png

可以对照一下,studenName为"James"这一条,对应的studentPhone就是"44444444",符合SELECT出来的结果

查看、删除存储过程和函数

1、查看存储过程和函数的状态

SHOW STATUS可以查看存储过程核函数的状态,其基本语法结构如下:

SHOW {PROCEDURE | FUNCTIOn} STATUS [LIKE 'pattern'

这个语句是一个MySQL的扩展,他返回子程序的特征,如数据库、名字、类型、创建者及创建和修改日期。如果没有指定样式,根据使用的语句,所有存储过程或存储函数的信息都被列出。PROCEDURE和FUNCTIOn分别表示查看存储过程和函数,LIKE语句表示匹配存储过程或函数的名称。

举个例子:

SHOW PROCEDURE STATUS

运行结果为:

9529d074d1e8f6782f772f5e346ef93a.png

后面还有一些字段,截图截不全没办法。查看存储函数也一样,可以自己试试看。

2、查看存储过程和函数的定义

除了SHOW STATUS外,还可以使用SHOW CREATE来查看存储过程的定义,基本格式为:

SHOW CREATE {PROCEDURE | FUNCTION} sp_name

比如:

SHOW CREATE FUNCTION NameByZip

我查看了NameByZip这个函数的定义,结果为:

09541f914e4d30d764f6c2650e7ca4a4.png

这个Create Function字段就是创建的存储函数的内容

3、删除存储过程和函数

删除存储过程核函数,可以使用DROP语句,基本语法如下:

DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name

这个语句被用来移除一个存储过程或函数。sp_name为待移除的存储过程或函数的名称。

IF EXISTS子句是一个MySQL的扩展,如果程序或函数不存储,它可以防止错误发生,产生一个用SHOW WARNINGS查看的警告。举个例子:

DROP PROCEDURE CountStudentDROP FUNCTION NameByZip;

这么简单就可以了。注意这里没有讲修改存储过程和存储函数,因为修改存储过程或者函数只能修改存储过程或者存储函数的特性,不能直接对已有的存储过程或函数进行修改,如果必须要改,只能先DROP在重新编写代码,CREATE一个新的。

73dd3720d9ed7368a745267ab2f36616.png

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

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

相关文章

跨域访问-预请求及跨域常见问题

预请求 参考:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS#预请求 简而言之,在跨域并且尝试添加一些特殊头及自定义头的情况下,由于浏览器的安全机制,会加多一次OPTIONS预请求(询问请求&am…

mysql查询优化之一:mysql查询优化常用方式

一、为什么查询速度会慢? 一个查询的生命周期大致可以按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端。其中在“执行”阶段包含了大量为了检索…

抖音右上角一个小黄点是什么_抖音官方入驻视频号,释放了一个什么样的信号?...

专注视频号观察第 328 篇这几天,视频号生态新入驻了一个企业号,在圈里引起不少的轰动,因为这个号的名字叫做———抖音。这件事在圈里引发不少的轰动,很多人惊叹:“连抖音都来开视频号了,你还在等什么&…

Jenkins:部署JEE工件

随着持续集成和持续交付的出现 ,我们的构建被分为不同的步骤,以创建部署管道。 这些步骤中的一些步骤可以是例如编译和运行快速测试,运行慢速测试,运行自动验收测试或发布应用程序等。 部署流程的最后一步意味着将我们的产品&…

seafile 部署_Seafile开启webdav及读写性能测试

为什么要在seafile搞webdavSeafile 一直是一款可靠的文件同步web应用,经过个人测试,同一台机器上,seafile在传输文件时的速度比nextcloud要快(可能也与php的设置有关系),这是seafile的优势。但是&#xff0…

Python--校园网爬虫记

查成绩,算分数,每年的综合测评都是个固定的过程,作为软件开发者,这些过程当然可以交给代码去做,通过脚本进行网络请求获取数据,然后直接进行计算得到基础分直接填表就好了,查成绩再手动计算既容…

Spring–添加SpringMVC –第1部分

欢迎来到本教程的第四部分。 在这一部分中,我们将使用Spring MVC编写控制器和视图,并考虑我们的REST模型。 我们必须做的第一件事,就是根据目前的情况制作一个Web应用程序。 我们将web / WEB-INF文件夹添加到我们的项目根目录。 在WEB-INF内创…

access month函数用法_学会了这7个EXCEL日期函数技巧,老板再让你加班,你找我!...

日期函数,常用年月日,时分秒,星期,季度,求差值等,学会以下几个函数,老板再让你加班,你找我!1、记录当前时间(不随系统时间变化)NOW()函数与数据有效性结合,记…

meta 的作用 搜集

Meta标签中的format-detection属性及含义 format-detection翻译成中文的意思是“格式检测”&#xff0c;顾名思义&#xff0c;它是用来检测html里的一些格式的&#xff0c;那关于meta的format-detection属性主要是有以下几个设置&#xff1a;<meta name"format-detecti…

ThinkPHP 3.2.x 集成极光推送指北

3.2版本已经过了维护生命周期&#xff0c;官方已经不再维护&#xff0c;请及时更新至5.0版本 —— ThinkPHP 官方仓库 以上&#xff0c;如果有条件&#xff0c;请关闭这个页面&#xff0c;然后升级至 ThinkPHP 5&#xff0c;如果由于各种各样的原因无法升级至 TP 5 &#xff0c…

Java多线程——不变性与安全发布

1、不变性 某个对象在被创建后其状态就不能被修改&#xff0c;那么这个对象就称为不可变对象&#xff0c;不可变对象一定是线程安全的。不可变对象很简单。他们只有一种状态&#xff0c;并且该状态由构造函数来控制。 当满足以下条件时&#xff0c;对象才是不可变的&#xff1a…

中tr不能显示字符_垃圾文本识别中基本操作指南和错误总结,第三部分

创建模型需要用到机器学习的库&#xff0c;所以我们先下载sklearn库sklearn库下载完成后再输入库文件&#xff0c;就可以完美运行。然后就是划分测试集和训练集&#xff0c;需要注意的是&#xff0c;在从数据处理函数中导入数据时&#xff0c;足足运行了有将近30多秒&#xff0…

(转载)20分钟读懂程序集

转自&#xff1a;http://www.cnblogs.com/damonlan/p/3221347.html 说到程序集&#xff0c;我刚开始对这个名词特别的郁闷&#xff01;~。然后 前些天花了些时间 好好读了一下&#xff0c;现在比较清晰了&#xff0c;把一些书上看到的 记下来&#xff0c;以飨读者。希望没浪费你…

大数据胸_喂母乳会导致胸下垂?!你被这个谣言骗了多少年?

很多人认为&#xff0c;给宝宝喂奶会导致胸下垂。有些爱美的妈妈&#xff0c;甚至在宝宝出生6个月后就着急断奶。那么&#xff0c;喂奶真的会导致胸下垂么&#xff1f;给大家讲两个真实的调查结果哈~2004年的一次针对496名新妈妈的调查结果显示&#xff0c;有75%的母乳喂养母亲…

自制ACL+DHCP实验(初版)

&#xff08;实验用gns模拟器&#xff09; ACL 实验拓扑&#xff1a; 实验要求&#xff1a; 1.1.1.1→3.3.3.3 不通 11.11.11.11→3.3.3.3 通 2.2.2.2→3.3.3.3 通 实验步骤&#xff1a; 步骤一&#xff1a;基本配置 R1&#xff1a; R1#conf t R1(config)#int lo0 R1(config-if…

pil 图像最大值_第97天:图像库 PIL(二)

上节我们讲了 Python 的图像处理库 PIL 的基本图像处理功能&#xff0c;打开了 PIL 的神秘面纱。这节我们接着讲 PIL 的 Image 模块的常用方法。Image 模块的方法convertImage.convert(modeNone, matrixNone, ditherNone, palette0, colors256)参数说明&#xff1a;mode&#x…

c#的委托用法delegate

转载于:https://www.cnblogs.com/douzujun/p/6555886.html

np读取csv文件_被 Pandas read_csv 坑了

-- 不怕前路坎坷&#xff0c;只怕从一开始就走错了方向Pandas 是python的一个数据分析包&#xff0c;纳入了大量库和一些标准的数据模型&#xff0c;提供了高效地操作大型数据集所需的工具。Pandas 就是为解决数据分析任务生的&#xff0c;无论是数据分析还是机器学习项目数据预…

铃木uy125摩托车机油_UY125 新瑞梦UM125发布 济南铃木于湖南株洲吹响国IV集结号...

​4月18日&#xff0c;济南铃木在湖南株洲天台开元酒店举行了2019年新品发布会&#xff0c;并于现场发布了两款极具终端战略意义的新款国IV车型&#xff0c;分别为定位“实用运动”的全新个性化踏板车型UY125&#xff0c;以及能够进一步巩固济南铃木在国IV入门级踏板车型领域绝…

js判断时间是早上还是下午_牛奶早上喝好,还是晚上喝好?没想到“最佳时间”是这个点,颠覆了!...

都说喝牛奶好&#xff0c;要多喝。可什么时间喝牛奶最好呢&#xff1f;是饭前、饭后还是睡前&#xff1f;又或者喝酒前&#xff1f;确实得好好说说。传言&#xff1a;空腹时身体比较缺能量&#xff0c;牛奶里的蛋白会去提供能量&#xff0c;不会去构成和修复组织(比如修复皮肤)…