《教学课件项目7 以程序方式处理学生信息管理数据表.pptx》由会员分享,可在线阅读,更多相关《教学课件项目7 以程序方式处理学生信息管理数据表.pptx(103页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、MySQL数据库原理及应用(微课版|第3版)数据库原理及应用数据库原理及应用-项目7 以程序方式处理学生信息管理数据表MySQL数据库原理及应用(微课版|第3版)情景导入情景导入我们通过批量执行我们通过批量执行100100万条万条insert intoinsert into语句,实现了语句,实现了“向学生基本信息表向学生基本信息表student_newstudent_new中插入中插入100100万条记录万条记录”。但是,这种方式存在着代码冗余、可读性低、。但是,这种方式存在着代码冗余、可读性低、可维护性差和执行效率低下等缺点。可维护性差和执行效率低下等缺点。王宁仔细分析了李老师提供的王宁仔细
2、分析了李老师提供的SQLSQL脚本,发现每一条脚本,发现每一条insert insert intointo语句中的学号(语句中的学号(snosno)都是有规律的,相邻学号之间相差)都是有规律的,相邻学号之间相差1 1。王宁思考能不能像其他编程语言一样,借助循环来实现批量插王宁思考能不能像其他编程语言一样,借助循环来实现批量插入数据的功能,如何来实现呢?王宁带着这个问题投入了本项入数据的功能,如何来实现呢?王宁带着这个问题投入了本项目的学习中。目的学习中。MySQL数据库原理及应用(微课版|第3版)?掌握掌握SQLSQL编程基础编程基础?创建与使用存储过程和存储函数创建与使用存储过程和存储函数?
3、创建与使用触发器创建与使用触发器?掌握事务、锁的概念和应用掌握事务、锁的概念和应用主要内容主要内容MySQL数据库原理及应用(微课版|第3版)项目项目1 1 理解理解数据库数据库职业能力目标(含课程思政)了解了解SQLSQL编程基础、游标、存储过程和存储函数、编程基础、游标、存储过程和存储函数、触发器及事务的作用触发器及事务的作用掌握游标、存储过程和存储函数、触发器及事务掌握游标、存储过程和存储函数、触发器及事务的创建方法的创建方法掌握游标、存储过程和存储函数、触发器及事务掌握游标、存储过程和存储函数、触发器及事务的修改及删除方法的修改及删除方法MySQL数据库原理及应用(微课版|第3版)任务
4、任务7-1 7-1 掌握掌握SQLSQL编程基础编程基础【任务提出】【任务提出】王宁想以程序方式向学生基本信息表王宁想以程序方式向学生基本信息表student_newstudent_new中插入中插入100100万条记录。但是他在万条记录。但是他在SQLSQL编程方面的基编程方面的基础为零。因此,王宁需要先掌握础为零。因此,王宁需要先掌握SQLSQL编程的基础知编程的基础知识。识。MySQL数据库原理及应用(微课版|第3版)尽管MySQL有各种使用便捷的图形化用户界面,但各种功能的实现基础是SQL语言,只有SQL语言可以直接和数据库进行交互。SQL语言是一系列操作数据库及数据库对象的命令语句,
5、因此了解基本语法和流程语句的构成是必须的。SQL语言基础主要包括常量和变量、表达式、运算符、控制语句等。(一)(一)SQLSQL基础基础MySQL数据库原理及应用(微课版|第3版)1、常量与变量 (1)常量。常量也称为文字值或标量值,是指程序运行中值始终不改变的量。(一)(一)SQLSQL基础基础MySQL数据库原理及应用(微课版|第3版)常量类型常量类型常量表示说明常量表示说明字符串常量包括在单引号()或双引号()中,由字母(az、AZ)、数字字符(09)以及特殊字符(如感叹号(!)、at符()和井字号(#)组成。示例:China、Output X is:、Nhello十进制整型常量使用不带
6、小数点的十进制数据表示。示例:1234、+2008、-123十六进制整型常量使用前缀0 x后跟十六进制数字串表示。示例:0 x1F00、0 xEEC、0X19日期常量使用单引号()将日期时间字符串括起来。MySQL是按年-月-日的顺序表示日期的。中间的间隔符可以用“-”,也可以使用如“”、“/”、“”或“%”等特殊符号。示例:2009-01-03、2008/01/09、20101210实型常量有定点表示和浮点表示两种方式。示例:897.1、-123.03、19E24位字段值使用bvalue符号写位字段值。value是一个用0和1写成的二进制值。直接显示bvalue的值可能是一系列特殊的符号。例
7、如,b0显示为空白,b1显示为一个笑脸图标。示例:SELECT BIN(b111101+0),OCT(b111101+0)布尔常量布尔常量只包含两个可能的值:TRUE和FALSE。FALSE的数字值为“0”,TRUE的数字值为“1”。示例:获取TRUE和FALSE的值:SELECT TRUE,FALSENULL值NULL值可适用于各种列类型,它通常用来表示“没有值”、“无数据”等意义,并且不同于数字类型的“0”或字符串类型的空字符串(一)(一)SQLSQL基础基础MySQL数据库原理及应用(微课版|第3版)(2)变量。变量就是在程序执行过程中,其值是可以改变的量。变量由变量名和变量值构成,其类
8、型与常量一样。变量名不能与命令和函数名相同,这里的变量和在数学中所遇到的变量的概念基本上是一样的,可以随时改变它所对应的数值。在MySQL系统中,存在3种类型的变量:第1种是系统变量全局(global)变量会话(session)变量第2种是用户变量第3种是局部变量(一)(一)SQLSQL基础基础MySQL数据库原理及应用(微课版|第3版)1)系统变量全局变量在MySQL启动时由服务器自动将它们初始化为默认值,这些默认值可以通过更改my.ini文件来更改。会话变量在每次建立一个新的连接时,由MySQL初始化。MySQL会将当前所有全局变量的值复制一份作为会话变量。全局变量与会话变量的区别在于:全
9、局变量主要影响整个MySQL实例的全局设置。大部分全局变量都是作为MySQL的服务器调节参数存在。对全局变量的修改会影响到整个服务器,但是对会话变量的修改只会影响到当前的会话,也就是当前的数据库连接。(一)(一)SQLSQL基础基础MySQL数据库原理及应用(微课版|第3版)全局变量和会话变量。查看全局变量的值例:查看当前的版本信息SELECT version AS 当前MySQL,CURRENT_DATE;例:查看全局变量SHOW GLOBAL variables;SHOW variables WHERE variable_name LIKE collation%;(一)(一)SQLSQL基
10、础基础MySQL数据库原理及应用(微课版|第3版)全局变量和会话变量。设置全局变量的值【例7.1】将全局系统变量sort_buffer_size的值改为40000,执行命令如下。SET global.sort_buffer_size=25000;(一)(一)SQLSQL基础基础【例7.2】对于当前会话,把系统变量SQL_SELECT_LIMIT的值设置为100。这个变量决定了SELECT语句的结果集中的最大行数。SET SESSION.SQL_SELECT_LIMIT=100;SELECT LOCAL.SQL_SELECT_LIMIT;MySQL数据库原理及应用(微课版|第3版)2)用户变量。
11、用户可以在表达式中使用自己定义的变量,这样的变量叫作用户变量。用户变量与连接有关。即,一个客户端定义的变量不能被其他客户端看到或使用。定义和初始化一个用户变量可以使用SET或SELECT语句,语法格式如下:SET 变量名=表达式;SET 变量名:=表达式;SELECT 变量名:=表达式;例如:创建用户变量name,并赋值为“王小强”。(1)SET name=王小强;(2)SET name:=王小强;(3)SELECT name:=王小强;(一)(一)SQLSQL基础基础MySQL数据库原理及应用(微课版|第3版)【例7.3】创建用户变量user1并赋值为1,user2赋值为2,user3赋值为
12、3。SET user1=1,user2=2,user3=3;或 SELECT user1:=1,user2:=2,user3:=3;【例7.4】创建用户变量user4,它的值为user3的值加1。SET user4=user3+1;或 SELECT user4:=user3+1;(一)(一)SQLSQL基础基础MySQL数据库原理及应用(微课版|第3版)【例7.5】查询【例7.3】和【例7.4】中创建的变量user1、user2、user3和user4的值。(一)(一)SQLSQL基础基础SELECT user1,user2,user3,user4;+-+-+-+-+|user1|user2|
13、user3|user4|+-+-+-+-+|1|2|3|4|+-+-+-+-+1 row in setMySQL数据库原理及应用(微课版|第3版)【例7.6】使用查询结果给变量赋值。USE gradem;SET student=(SELECT sname FROM student WHERE sno=2007010120);【例7.7】查询表student中名字等于例8.6中student值的学生信息。SELECT sno,sname,sbirthday FROM student WHERE sname=student;(一)(一)SQLSQL基础基础【例7.8】利用SELECT语句将表中数据
14、赋值给变量。select name:=password from suser limit 0,1;MySQL数据库原理及应用(微课版|第3版)【例7.9】查看“gradem”数据库中的学生信息,而条件只是查看student表中“系别”为“软件工程系”的学生信息。USE gradem;SET 系别=软件工程系;SELECT sno,sname,saddress FROM student WHERE sdept=系别;注意:只要关闭查询窗口,用户变量就失效(一)(一)SQLSQL基础基础MySQL数据库原理及应用(微课版|第3版)3)局部变量。例如,定义局部变量myvar,数据类型为INT,默认值
15、为10,代码如下。DECLARE myvar int DEFAULT 10;下面给局部变量myvar赋值为100,代码如下。SET myvar=100;(一)(一)SQLSQL基础基础MySQL数据库原理及应用(微课版|第3版)2表达式在SQL语言中,表达式就是常量、变量、列名、复杂计算、运算符和函数的组合。一个表达式通常都有返回值。与常量和变量一样,表达式的值也具有某种数据类型。根据表达式的值的类型,表达式可分为字符型表达式、数值型表达式和日期型表达式。表达式一般用在SELECT及SELECT语句的WHERE子句中。(一)(一)SQLSQL基础基础MySQL数据库原理及应用(微课版|第3版)
16、例如,如下所示为一个使用表达式的SELECT查询语句。SELECT A.sno,AVG(degree)AS 平均成绩,CONCAT(sname,SPACE(6),ssex,SPACE(4),classno,班,SPACE(4),left(sno,4),年级)AS 考生信息FROM sc A INNER JOIN student B ON A.sno=B.snoGROUP BY A.sno,sname,ssex,classnoORDER BY 平均成绩 DESC;+-+-+-+|sno|平均成绩|考生信息|+-+-+-+|2007030436|94.5000|徐小栋 男 20070304班 20
17、07年级|2007030409|94.0000|刘明海 男 20070304班 2007年级|2007030408|93.0000|刘众林 男 20070304班 2007年级|2007030420|92.7500|李鹏飞 男 20070304班 2007年级|2007010106|92.6667|孙晋梅 女 20070101班 2007年级|(一)(一)SQLSQL基础基础MySQL数据库原理及应用(微课版|第3版)结构化程序设计语言的三种基本结构:(1)顺序结构(2)条件分支结构(3)循环结构顺序结构是一种自然结构,条件分支结构和循环结构需要根据程序的执行情况对程序的执行顺序进行调整和控制
18、。在SQL语言中,流程控制语句就是用来控制程序执行流程的语句,也称流控制语句或控制流语句。(二)(二)SQLSQL的流程控制的流程控制在MySQL中,这些流程控制语句和局部变量只能在存储过程或函数、触发器或事务的定义中。MySQL数据库原理及应用(微课版|第3版)(1)BEGINEND语句块。关键字BEGIN定义SQL语句的起始位置,END定义同一块SQL语句的结尾。它的语法格式如下。BEGINsql_statement|statement_block;END;(二)(二)SQLSQL的流程控制的流程控制sql_statement是使用语句块定义的任何有效的SQL语句;statement_bl
19、ock是使用语句块定义的任何有效SQL语句块。MySQL数据库原理及应用(微课版|第3版)(2)IFELSE条件语句。用于指定SQL语句的执行条件。语法格式如下。IF search_condition THEN statement_listELSEIF search_condition THEN statement_listELSE statement_listEND IF;(二)(二)SQLSQL的流程控制的流程控制其中,search_condition是返回true或false的逻辑表达式。如果逻辑表达式中含有SELECT语句,必须用圆括号将SELECT语句括起来。MySQL数据库原理及应
20、用(微课版|第3版)【例7.10】使用IFELSE条件语句查询计算机系的办公室位置。如果查询结果为空,则显示“办公地点不详”,否则显示其办公地点。分析:(1)查询出计算机系的办公位置 select office FROM department WHERE deptname=计算机工程系;(2)根据结果是否为空,分别处理 IF()THEN BEGIN END;ELSE BEGIN END;END IF;(二)(二)SQLSQL的流程控制的流程控制MySQL数据库原理及应用(微课版|第3版)set sofficename:=(select office FROM department WHERE
21、deptname=计算机系);IF(sofficename IS NULL)THEN BEGIN SELECT 办公地点不详 AS 办公地点;SELECT*FROM department WHERE deptname=计算机系;END;ELSE SELECT office FROM department WHERE deptname=计算机系;END IF;(二)(二)SQLSQL的流程控制的流程控制MySQL数据库原理及应用(微课版|第3版)(3)CASE分支语句。CASE关键字可根据表达式的真假来确定是否返回某个值,可以允许使用表达式的任何位置使用这一关键字。使用CASE语句可以进行多个分
22、支的选择,CASE语句具有如下两种格式。简单格式:将某个表达式与一组简单表达式进行比较以确定结果。(二)(二)SQLSQL的流程控制的流程控制简单CASE格式的语法如下。CASEWHEN when_expression THEN result_expression;nELSE else_result_expression;END CASE;MySQL数据库原理及应用(微课版|第3版)declare dj int default 0;SELECT count(*)into dj FROM sc WHERE degree=100 THEN SELECT 不及格人次较多 as 档次;WHEN dj=
23、50 AND dj=1 AND dj 50 THEN SELECT 不及格人次较少 as 档次;ELSE SELECT 没有不及格的 as 档次;END CASE;(二)(二)SQLSQL的流程控制的流程控制MySQL数据库原理及应用(微课版|第3版)v使用使用IFIF语句和语句和CASECASE语句都可以实现多分支程序,但是不语句都可以实现多分支程序,但是不管哪种实现方式,在执行程序时,同一时刻只能选择其管哪种实现方式,在执行程序时,同一时刻只能选择其中一个分支运行。在日常生活中,我们也经常面临各种中一个分支运行。在日常生活中,我们也经常面临各种各样的选择,有时选择比努力重要,但各样的选择,
24、有时选择比努力重要,但。思政小贴士思政小贴士MySQL数据库原理及应用(微课版|第3版)(4)循环语句。WHILEEND WHILE语句。WHILE语句是设置重复执行SQL语句或语句块的条件。当指定的条件为真时,重复执行循环语句。可以在循环体内设置LEAVE和ITERATE语句,以便控制循环语句的执行过程,其语法格式如下。(二)(二)SQLSQL的流程控制的流程控制begin_label:WHILEWHILE Boolean_expression DODO sql_statement|statement_block;LEAVELEAVE begin_label;sql_statement|st
25、atement_block;ITERATEITERATE begin_label;sql_statement|statement_block;END WHILEEND WHILE;MySQL数据库原理及应用(微课版|第3版)【例7.11】使用WHILE语句求110之和。SET i=1,sum=0;WHILE i100END REPEAT;SELECT sum;(二)(二)SQLSQL的流程控制的流程控制MySQL数据库原理及应用(微课版|第3版)LOOPEND LOOP语句。LOOP语句可以使某些特定的语句重复执行,实现一个简单的循环。但是LOOP语句本身没有停止循环的语句,必须是遇到LEAV
26、E语句才能停止循环。其语法格式如下。(二)(二)SQLSQL的流程控制的流程控制begin_label:LOOP sql_statement|statement_block;LEAVE begin_label;sql_statement|statement_block;ITERATE begin_label;sql_statement|statement_block;END LOOP;MySQL数据库原理及应用(微课版|第3版)例如,使用LOOP语句求1100之和。SET i=1,sum=0;add_sum:LOOP BEGIN SET sum=sum+i;SET i=i+1;END;IF i
27、100 THEN LEAVE add_sum;END LOOP;SELECT sum;(二)(二)SQLSQL的流程控制的流程控制MySQL数据库原理及应用(微课版|第3版)2、条件和处理程序的定义特定条件需要特定处理。这些条件可能涉及错误以及子程序中的一般流程控制。定义条件和处理程序是事先定义程序执行过程中可能遇到的问题,并且可以在处理程序中定义解决这些问题的办法。这种方式可以提前预测可能出现的问题,并提出解决办法。这样可以增强程序处理问题的能力,避免程序异常停止。MySQL中都是通过DECLARE关键字来定义条件和处理程序。(二)(二)SQLSQL的流程控制的流程控制MySQL数据库原理及
28、应用(微课版|第3版)2、条件和处理程序的定义【例7.12】定义条件和处理程序,具体的执行代码如下。CREATE TABLE test(t1 int,primary key);#建立测试表testDELIMITER/#重新定义命令结束符为/CREATE PROCEDURE handlertest()BEGIN DECLARE CONTINUE handler FOR SQLSTATE 23000 SET x1=1;SET x=1;INSERT INTO test VALUES(1);SET x=2;INSERT INTO test VALUES(1);SET x=3;SELECT x,x1;E
29、ND /(二)(二)SQLSQL的流程控制的流程控制MySQL数据库原理及应用(微课版|第3版)3、注释注释是程序代码中不被执行的文本字符串,用于对代码进行说明或进行诊断的部分语句。(1)井字符(#):从井字符到行尾都是注释内容。(2)双连线字符(-):从双连线字符到行尾都是注释内容。注意,双连线后一定要加一个空格。(3)正斜杠星号字符(/*/):开始注释对(/*)和结束注释对(*/)之间的所有内容均视为注释。(二)(二)SQLSQL的流程控制的流程控制MySQL数据库原理及应用(微课版|第3版)MySQL提供了大量丰富的系统函数,它们功能强大、方便易用。使用这些函数,可以极大提高用户对数据库
30、的管理效率,更加灵活地满足不同用户的需求。从功能上可以分为以下几类函数:字符串函数、数学函数、日期和时间函数、条件判断函数、系统信息函数和加密函数等。(三)(三)MySQLMySQL常用函数常用函数MySQL数据库原理及应用(微课版|第3版)游标(Cursor)是类似于C语言指针一样的结构,在MySQL中它是一种数据访问机制,允许用户访问单独的数据行,而不是对整个行集进行操作。在MySQL中,游标主要包括游标结果集和游标位置两部分,游标结果集是由定义游标的SELECT语句返回行的集合,游标位置则是指向这个结果集中的某一行的指针。在使用游标之前首先要声明游标,其语法格式如下。DECLARE cu
31、rsor_name CURSOR FOR select_statement;(四)游标(四)游标MySQL数据库原理及应用(微课版|第3版)例如,在gradem数据库中为teacher表创建一个普通的游标,定义名称为T_cursor,可用语句如下所示。DECLARE T_cursor CURSORFOR SELECT tno,tname FROM teacher;在声明游标以后,就可对游标进行操作。主要包括打开游标、检索游标、关闭游标。(四)游标(四)游标MySQL数据库原理及应用(微课版|第3版)1打开游标使用游标之前必须首先打开游标,打开游标的语法如下所示。OPEN cursor_name
32、;例如,打开前面创建的T_cursor游标,使用如下语句。OPEN T_cursor;(四)游标(四)游标MySQL数据库原理及应用(微课版|第3版)2检索游标在打开游标以后,就可以提取数据。FETCH语句的功能是获取游标当前指针的记录,并传给指定变量列表,注意变量数必须与MySQL游标返回的字段数一致。要获得多行数据,需要使用循环语句去执行FETCH,其语法如下。FETCH cursor_name INTO var1,var2,;MySQL的游标是向前只读的,也就是说,只能顺序地从开始往后读取结果集,不能从后往前,也不能直接跳到中间的记录。(四)游标(四)游标MySQL数据库原理及应用(微课
33、版|第3版)首先,FETCH离不开循环语句。一般使用Loop和while比较清楚,而且代码简单。这里使用Loop为例,代码如下。fetchLoop:Loop FETCH T_Cursor INTO v_tno,v_tname;end Loop;(四)游标(四)游标上述循环是死循环,没有退出的条件。与SQL和ORACLE不同,MySQL通过一个Error handler的声明来进行判断。DECLARE CONTINUE handler FOR NOT FOUND;MySQL数据库原理及应用(微课版|第3版)下面的代码就是使用FETCH语句来检索游标中可用的数据。CREATE PROCEDURE
34、proccursor()BEGINDECLARE done int DEFAULT 0;DECLARE v_tno varchar(4)DEFAULT;DECLARE v_tname varchar(8)DEFAULT;DECLARE T_cursor CURSOR FOR SELECT tno,tname FROM teacher;#定义游标DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;#定义处理程序SET done=0;OPEN T_Cursor;#打开游标fetch_Loop:LOOPFETCH T_Cursor INTO v_tno
35、,v_tname;#检索游标IF done=1 THEN LEAVE fetch_Loop;ELSE SELECT v_tno,v_tname;END IF;END LOOP fetch_Loop;END上述语句中的变量done保存的就是FETCH操作的结束信息。如果其值为零,则表示有记录检索成功;如果值不为零,则FETCH语句由于某种原因而操作失败。(四)游标(四)游标MySQL数据库原理及应用(微课版|第3版)3关闭游标打开游标以后,MySQL服务器会专门为游标开辟一定的内存空间,以存放游标操作的数据结果集。所以在不使用游标的时候,一定要关闭游标,以通知服务器释放游标所占用的资源。在一个游
36、标关闭后,如果没有重新打开,则不能使用它。但是,使用声明过的游标不需要再次声明。如果不明确关闭游标,MySQL将会在到达END语句时自动关闭它。(四)游标(四)游标关闭游标的具体语法如下所示。CLOSE cursor_name;在检索游标T_cursor后可用如下语句来关闭它。CLOSE T_cursor;MySQL数据库原理及应用(微课版|第3版)【任务实施】【任务实施】王宁使用编程基础知识来解决任务提出中的问题,王宁使用编程基础知识来解决任务提出中的问题,具体实现代码如下。具体实现代码如下。任务任务7-1 7-1 掌握掌握SQLSQL编程基础编程基础BEGIN DECLARE i INT
37、DEFAULT 1;WHILE(i=1000000)DO BEGININSERT INTO student_new(sno)VALUES(i+1);END;END WHILE;END;MySQL数据库原理及应用(微课版|第3版)任务任务7-2 7-2 创建与使用存储过程和存储函数创建与使用存储过程和存储函数【任务提出】【任务提出】在任务在任务7-17-1中,王宁利用编程基础知识,实现了中,王宁利用编程基础知识,实现了“向学向学生基本信息表生基本信息表student_newstudent_new中插入中插入100100万条记录万条记录”的基本的基本代码,但当运行时会出现语法错误。原因在于局部变量
38、和代码,但当运行时会出现语法错误。原因在于局部变量和循环语句必须嵌套在存储过程中才能成功运行。循环语句必须嵌套在存储过程中才能成功运行。王宁需要使用存储过程来验证上述代码的业务王宁需要使用存储过程来验证上述代码的业务逻辑是否正确,以及是否可以成功运行。逻辑是否正确,以及是否可以成功运行。MySQL数据库原理及应用(微课版|第3版)1什么是存储过程和存储函数 存储过程(Stored Procedure)和函数(Stored Function)是在数据库中定义一些完成特定功能的SQL语句集合,经编译后存储在数据库中。存储过程和函数中可包含流程控制语句及各种SQL语句。它们可以接受参数、输出参数、返
39、回单个或者多个结果。(一)(一)存储过程和存储函数概述存储过程和存储函数概述MySQL数据库原理及应用(微课版|第3版)2存储过程的优点在MySQL中使用存储过程,而不是用存储在客户端计算机本地的SQL程序有以下优点。(1)存储过程增强了SQL语言的功能和灵活性。(2)存储过程允许模块化程序设计。(3)存储过程能实现较快的执行速度。(4)存储过程能够减少网络流量。(5)存储过程可被作为一种安全机制来充分利用。(一)(一)存储过程和存储函数概述存储过程和存储函数概述MySQL数据库原理及应用(微课版|第3版)(1)利用CREATE PROCEDURE语句创建。用户可以使用CREATE PROCE
40、DURE语句创建存储过程,其基本语法如下:CREATE PROCEDURE procedure_name(proc_parameter,)Routine_body(二)创建(二)创建存储过程存储过程MySQL数据库原理及应用(微课版|第3版)各参数的含义如下:(1)procedure_name:存储过程的名称(2)proc_parameter:存储过程中的参数列表,其形式为:【IN|OUT|INOUT】param_name type IN表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出,默认为IN,param_name表示参数名称,type表示参数类型。(二)创建(二)创建
41、存储过程存储过程(3)Routine_body:包含在存储过程中的SQL语句块。可以用BEGINEND来表示SQL代码的开始与结束。MySQL数据库原理及应用(微课版|第3版)【例7.17】创建一个存储过程,从数据库gradem的student表中检索出所有籍贯为“青岛”的学生的学号、姓名、班级号及家庭地址等信息。具体语句如下。USE gradem;DELIMITER/CREATE PROCEDURE proc_stud()BEGIN SELECT sno,sname,classno,saddress FROM student WHERE saddress LIKE%青岛%ORDER BY s
42、no;END/DELIMITER;(二)创建(二)创建存储过程存储过程MySQL数据库原理及应用(微课版|第3版)【例7.18】创建一个名为num_sc的存储过程,统计某位同学的考试门数,代码如下。DELIMITER/CREATE PROCEDURE num_sc(IN tmp_sno char(10),OUT count_num INT)BEGIN SELECT COUNT(*)INTO count_num FROM sc WHERE sno=tmp_sno;END/DELIMITER;(二)创建(二)创建存储过程存储过程MySQL数据库原理及应用(微课版|第3版)(2)利用Navicat图
43、形工具创建。利用Navicat图形工具创建存储过程方便、简单,且易操作。操作步骤:(1)在Navicat中,连接到mysql服务器。(2)展开【mysql】|【gradem】|【函数】,右键单击该节点,选择【新建函数】命令。(二)创建(二)创建存储过程存储过程(3)打开【函数向导】对话框,选择例程类型【过程|函数】,设置参数,输入代码。(4)单击工具栏上的【保存】按钮,输入过程名,单击【确定】按钮即可完成。MySQL数据库原理及应用(微课版|第3版)(三)调用存储过程在MySQL系统中,因为存储过程和数据库相关,如果要执行其他数据库中的存储过程,需要打开相应的数据库或指定数据库名称。在Navi
44、cat工具中,调用存储过程的方法非常简单。也可以利用CALL命令调用存储过程,其语法格式如下。CALL dbname.sp_name(parameter,);(三)调用(三)调用存储过程存储过程MySQL数据库原理及应用(微课版|第3版)【例7.19】调用例7.18所创建的存储过程num_sc,代码如下。(三)调用(三)调用存储过程存储过程由上面代码看出,使用CALL语句来调用存储过程,使用SELECT语句来查询存储过程的输出结果值。CALL num_sc(2007030101,num);#调用存储过程SELECT num;#查询返回结果+-+|num|+-+|4|+-+1 row in se
45、tMySQL数据库原理及应用(微课版|第3版)v在传统认知中,在传统认知中,SQLSQL是用来完成数据查询和更新的。其实它功是用来完成数据查询和更新的。其实它功能强大,可以像能强大,可以像C C、JavaJava、PythonPython等程序设计语言一样,利用等程序设计语言一样,利用存储过程和函数,实现更加复杂的功能,便于在处理业务数据存储过程和函数,实现更加复杂的功能,便于在处理业务数据之前完成数据的合法性检测。之前完成数据的合法性检测。思政小贴士思政小贴士v也许读者一开始并不适应也许读者一开始并不适应SQLSQL的编码规范,在实现过的编码规范,在实现过程中也遇到了各种各样的问题。但是,我
46、们程中也遇到了各种各样的问题。但是,我们,要根据错误提示,一步步解决问题。,要根据错误提示,一步步解决问题。MySQL数据库原理及应用(微课版|第3版)(1)利用CREATE FUNCTION语句创建。在MySQL中,存储函数的使用方法与MySQL内部函数的使用方法是一样的。换言之,用户自己定义的存储函数与MySQL内部函数是一个性质的。两者唯一的区别在于,存储函数是用户自己定义的,而内部函数是MySQL的开发者定义的。在MySQL中,创建存储函数的基本语法如下。CREATE FUNCTION func_name(func_parameter,)RETURNS type characteris
47、tic,Routine_body(四)创建(四)创建存储函数存储函数MySQL数据库原理及应用(微课版|第3版)【例7.20】创建一个名为func_name的存储函数返回某班级的辅导员姓名,代码如下。(四)创建(四)创建存储函数存储函数DELIMITER&CREATE FUNCTION func_name(class_no varchar(8)RETURNS varchar(8)BEGIN RETURN (SELECT header FROM class WHERE classno=class_no);END&DELIMITER;MySQL数据库原理及应用(微课版|第3版)(2)利用Navic
48、at图形工具创建。利用Navicat图形工具创建存储函数的方法与存储过程类似。(四)创建(四)创建存储函数存储函数MySQL数据库原理及应用(微课版|第3版)(1)在Navicat工具中调用存储函数展开【mysql】|【gradem】单击工具栏上的【函数】按钮单击窗格上方的【运行函数】按钮,或用鼠标右键单击相应函数,在弹出的快捷菜单中选择【运行函数】命令。或双击要执行的函数,在编辑窗口中单击【运行】按钮。根据系统的提示,输入相应的参数即可。(五)调用(五)调用存储函数存储函数MySQL数据库原理及应用(微课版|第3版)(2)利用SELECT语句调用存储函数 语法格式如下。SELECT dbna
49、me.func_name(parameter,);其中:dbname是数据库名称,默认为当前数据库。func_name是存储函数的名称,parameter是指存储函数的参数。(五)调用(五)调用存储函数存储函数MySQL数据库原理及应用(微课版|第3版)【例7.21】调用存储函数func_teacher,代码如下。SELECT func_teacher(李新);#调用存储函数+-+|func_teacher(李新)|+-+|计算机工程系|+-+1 row in set(五)调用(五)调用存储函数存储函数MySQL数据库原理及应用(微课版|第3版)可以通过以下三种方法查看存储过程和存储函数的状态
50、信息使用SHOW STATUS语句使用SHOW CREATE语句通过查询information_schema数据库下的Routines表(六)查看存储过程和(六)查看存储过程和存储函数存储函数MySQL数据库原理及应用(微课版|第3版)(1)利用SHOW STATUS语句查看。在MySQL中,可以通过SHOW STATUS语句查看存储过程和函数的状态。其基本语法形式如下。SHOW PROCEDURE|FUNCTION STATUS LIKE pattern;其中,PROCEDURE参数表示查询存储过程,FUNCTION参数表示查询存储函数。LIKE pattern参数用来匹配存储过程或函数的名