第9章 存储过程、异常处理和游标_第1页
第9章 存储过程、异常处理和游标_第2页
第9章 存储过程、异常处理和游标_第3页
第9章 存储过程、异常处理和游标_第4页
第9章 存储过程、异常处理和游标_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章存储过程、异常处理和游标《MySQL数据库应用教程》刘瑞新主编配套资源目录第9章存储过程、异常处理和游标9.1存储过程9.2异常处理9.3使用游标处理结果集9.1.1存储过程的概念9.1.2创建存储过程CREATEPROCEDUREsp_name([proc_parameter1,proc_parameter2,…])[characteristic…]routine_body;9.1存储过程【例9-1】在studentinfo数据库中,创建一个显示student表中所有记录的存储过程。CREATEPROCEDUREproc_display_all_student()READSSQLDATABEGINSELECT*FROMstudent;END;9.1存储过程9.1存储过程9.1.3执行存储过程CALL[db_name.]sp_name([parameter1,parameter2,…]);【例9-2】执行proc_display_all_student过程。执行存储过程的SQL语句如下:CALLproc_display_all_student();9.1存储过程9.1.4创建存储过程的步骤1.实现存储过程的功能【例9-3】在studentinfo数据库中,创建不带参数的存储过程proc_selectcourse_avg,显示selectcourse表中的学号和每位学生的平均成绩。编写下面语句,SQL语句如下:SELECTstudentID,avg(Score)平均分

FROMselectcourseGROUPBYStudentID;9.1存储过程2.创建存储过程CREATEPROCEDUREproc_selectcourse_avg()READSSQLDATACOMMENT'显示学号和每位学生的平均成绩'BEGINSELECTstudentID,avg(Score)平均分FROMselectcourseGROUPBYStudentID;END;9.1存储过程3.执行存储过程CALLproc_selectcourse_avg();9.1存储过程9.1.5存储过程的管理1.查看存储过程的状态和定义(1)查看存储过程的状态SHOWPROCEDURESTATUS[LIKE'pattern'];例如,SQL语句如下:SHOWPROCEDURESTATUSLIKE'pro%';9.1存储过程(2)查看存储过程的定义SHOWCREATEPROCEDUREsp_name;例如,SQL语句如下:SHOWCREATEPROCEDUREproc_display_all_student;9.1存储过程(3)查看所有的存储过程SELECT*FROMinformation_schema.routines[WHEREroutine_name='名称'];例如SELECT*FROMinformation_schema.routines;SELECT*FROMinformation_schema.routinesWHEREroutine_name='proc_display_all_student';9.1存储过程2.修改存储过程ALTERPROCEDUREsp_name[characteristic…]【例9-4】修改存储过程up_display_all_student的定义,将特性改为MODIFIESSQLDATA,并指明权限调用者可以执行。ALTERPROCEDUREproc_display_all_studentMODIFIESSQLDATASQLSECURITYINVOKER;9.1存储过程3.删除存储过程DROPPROCEDURE[IFEXISTS]sp_name;【例9-5】删除存储过程proc_display_all_student。SQL语句如下:DROPPROCEDUREIFEXISTSproc_display_all_student;9.1存储过程3.使用Navicat管理存储过程9.1存储过程9.1.6存储过程的各种参数应用1.不带参数的存储过程(1)创建不带参数的存储过程CREATEPROCEDUREsp_name()[characteristic…]routine_body;9.1存储过程(2)执行不带参数的存储过程执行不带参数的存储过程的语法格式为:CALLsp_name();9.1存储过程【例9-6】在studentinfo数据库中,创建不带参数的存储过程proc_student_age,查询学生表student中的全体学生,显示姓名、性别和年龄。CREATEPROCEDUREproc_student_age()READSSQLDATACOMMENT'查询学生表student中的全体学生,显示姓名、性别和年龄'BEGINSELECTStudentNameAS姓名,SexAS性别,YEAR(NOW())-YEAR(Birthday)AS年龄

FROMstudent;END;CALLproc_student_age();9.1存储过程2.带IN参数的存储过程CREATEPROCEDUREsp_name(INparam_name1type1[,INparam_name2type2,…])[characteristic…]routine_body;在执行调用存储过程时,实参要给出具体的值。执行带IN参数的存储过程的语法格式为:CALLsp_name(parameter1[,parameter2,…]);9.1存储过程【例9-7】创建带有输入参数的存储过程proc_student_class,给定班级编号,查询出该班级的所有学生记录。1)CREATEPROCEDUREproc_student_class(INvClassIDCHAR(10))READSSQLDATABEGINSELECT*FROMstudentWHEREClassID=vClassID;END;2)CALLproc_student_class('2022600103');或SET@ClassID='2022600103';CALLproc_student_class(@ClassID);9.1存储过程3.带OUT参数的存储过程CREATEPROCEDUREsp_name(INparam_name1type1[,…],OUTparam_name2type2[,…])[characteristic…]routine_body执行带OUT参数的存储过程的语法格式为:SET@variable_name=表达式;CALLsp_name(parameter1[,…],@variable_name[,…]);9.1存储过程【例9-8】创建带有输入参数和输出参数的存储过程proc_selectcourse,给定学号,查询出该学生选修课程的数量和平均分,并通过输出参数返回。1)CREATEPROCEDUREproc_selectcourse(INvStudentIDCHAR(12),OUTvCountCourseINT,OUTvAvgScoreFLOAT)READSSQLDATABEGINSELECTCOUNT(CourseID)INTOvCountCourseFROMselectcourseWHEREStudentID=vStudentID;SELECTAVG(Score)INTOvAvgScoreFROMselectcourseWHEREStudentID=vStudentID;END;9.1存储过程2)SQL语句如下:CALLproc_selectcourse('202263050132',@CountCourse,@AvgScore);SQL语句如下:SET@StudentID='202263050132',@CountCourse=NULL,@AvgScore=NULL;CALLproc_selectcourse(@StudentID,@CountCourse,@AvgScore);SQL语句如下:SELECT@CountCourse,@AvgScore;9.1存储过程9.1存储过程【例9-9】创建带有输入参数和输出参数的存储过程proc_getscores,给定学号,统计该学生的考试课程数和合格的课程数,并通过输出参数返回。1)CREATEPROCEDUREproc_getscores(INvStudentIDCHAR(12),OUTvCountCourseINT,OUTvCountCoursesPassINT)READSSQLDATABEGINSELECTCOUNT(CourseID)INTOvCountCourseFROMselectcourseWHEREStudentID=vStudentID;SELECTCOUNT(CourseID)INTOvCountCoursesPassFROMselectcourseWHEREStudentID=vStudentIDANDScore>=60;END;9.1存储过程2)SET@StudentID='202263050132',@CountCourse=NULL,@CountCoursePass=NULL;CALLproc_getscores(@StudentID,@CountCourse,@CountCoursePass);SELECT@CountCourseAS考试课程数,@CountCoursePassAS合格的课程数;9.1存储过程【例9-10】创建存储过程proc_query_score,传入学号,显示该学号学生的成绩,如果全部成绩>=60,则返回“Allpasses”;否则返回通过的课程门数和不通过的课程门数。CREATEPROCEDUREproc_query_score(INst_idCHAR(12),OUTstrCHAR(30))BEGINDECLAREpass,notpassTINYINTDEFAULT0;SELECTCOUNT(*)INTOpassFROMselectcourseWHEREStudentID=st_idANDScore>=60;SELECTCOUNT(*)INTOnotpassFROMselectcourseWHEREStudentID=st_idANDScore<60;IFnotpass=0THENBEGINSETstr='Allpasses';END;ELSEBEGINSETstr=CONCAT('Pass:',CONVERT(pass,CHAR(2)),'Notpass:',CONVERT(notpass,CHAR(2)));END;ENDIF;SELECT*FROMselectcourseWHEREStudentID=st_id;END;9.1存储过程CALLproc_query_score('202263050132',@str);

SELECT@str;

CALLproc_query_score('202263050133',@str);

SELECT@str;9.1存储过程4.带INOUT参数的存储过程CREATEPROCEDUREsp_name(INOUTparam_nametype[,…])[characteristic…]routine_body;SET@variable_name=表达式;CALLsp_name(@variable_name[,…]);9.1存储过程【例9-11】创建带有INOUT参数的存储过程proc_ispass,给定学号、课程号,查询得到对应的成绩如果大于或等于60,则为1,否则为0,通过INOUT参数返回该值。CREATEPROCEDUREproc_ispass(INvStudentIDCHAR(12),INvCourseIDCHAR(10),INOUTpassINT)READSSQLDATABEGINDECLAREvScoreFLOAT;SELECTScoreINTOvScoreFROMselectcourseWHEREStudentID=vStudentIDANDCourseID=vCourseID;IFvScore>=60THENSETpass=1;ELSESETpass=0;ENDIF;END;9.1存储过程2)调用存储过程proc_ispass,INOUT参数保存在@pass中。SQL语句如下:SET@pass=0;CALLproc_ispass('202263050132','630575',@pass);SELECT@pass;9.1存储过程9.2.1自定义异常名称语句DECLAREcondition_nameCONDITIONFORcondition_value;SQLSTATEsqlstate_value|mysql_error_code;【例9-12】用名字定义“1062(23000)”这个错误,名称为error_insert。可以用两种不同的方法定义。方法一:使用sqlstate_value,SQL语句如下:DECLAREerror_insertCONDITIONFORSQLSTATE'23000';方法二:使用mysql_error_code,SQL语句如下:DECLAREerror_insertCONDITIONFOR1062;9.2异常处理9.2.2自定义异常处理程序DECLAREhandler_typeHANDLERFORcondition_valuesp_statement;condition_name|mysql_error_code|SQLSTATEsqlstate_value|SQLWARNING|NOTFOUND|SQLEXCEPTION9.2异常处理9.2.3异常处理实例【例9-13】在studentinfo数据库中创建一个表users,该表的u_id列为主键,当插入相同的主键值时触发异常。1)USEstudentinfo;DROPTABLEIFEXISTSusers;CREATETABLEusers(u_idINTPRIMARYKEY,u_nameCHAR(10));2)DROPPROCEDUREIFEXISTSproc_insert_userCREATEPROCEDUREproc_insert_user(INuidINT,INunameCHAR(10),OUTinfoCHAR(20))MODIFIESSQLDATABEGININSERTINTOusers(u_id,u_name)VALUES(uid,uname);SETinfo='Insertcomplete'; END;9.2异常处理3)调用存储过程。①CALLproc_insert_user(123,'Jack',@info);

SELECT*FROMusers;9.2异常处理②CALLproc_insert_user(123,'Lily',@info);

SELECT@info;9.2异常处理4)DROPPROCEDUREIFEXISTSproc_insert_user1;CREATEPROCEDUREproc_insert_user1(INuidINT,INunameCHAR(10),OUTinfoCHAR(20))MODIFIESSQLDATABEGIN#方式1DECLAREerror1CONDITIONFOR1062;

DECLAREEXITHANDLERFORerror1SETinfo='Cannotinsert';

#方式2#DECLAREEXITHANDLERFOR1062SETinfo='Cannotinsert';INSERTINTOusers(u_id,u_name)VALUES(uid,uname);SETinfo='Insertcomplete';END;9.2异常处理3)调用存储过程。①CALLproc_insert_user1(301,'Lily',@info);

SELECT*FROMusers;9.2异常处理②CALLproc_insert_user1(301,'Alex',@info);

SELECT@info;

SELECT*FROMusers;9.2异常处理9.3.1游标的概念9.3.2定义游标DECLAREcursor_nameCURSORFORselect_statement;9.3使用游标处理结果集【例9-14】在studentinfo数据库中,创建一个游标,从student表中查询出学号、姓名和班级号列的记录。DECLAREcur_studentCURSORFORSELECTStudentID,StudentName,BirthdayFROMstudent;SELECTStudentID,StudentName,BirthdayFROMstudent;9.3使用游标处理结果集9.3.3打开游标OPENcursor_name;例如,打开前面例题创建的cur_student游标,SQL语句如下:OPENcur_student;9.3使用游标处理结果集9.3.4使用游标FETCHcursor_nameINTOvar_name1[,var_name2,…];9.3使用游标处理结果集终止游标执行:DECLAREdoneBOOLEANDEFAULT0; --DECLAREdoneINTDEFAULTFALSE;DECLAREcurCURSORFORSELECT…;DECLARECONTINUEHANDLERFORNOTFOUNDSETdone=1;--DECLARECONTINUEHANDLERFORSQLSTATE'02000'SETdone=1;--DECLARECONTINUEHANDLERFORNOTFOUNDSETdone=TRUE;9.3使用游标处理结果集遍历游标第1种使用WHILE循环。OPENcur;FETCHcurINTO…;WHILE(done!=1)DO #WHILE(NOTdone)DO#处理语句;FETCHcurINTO…;ENDWHILE;CLOSEcur; #关闭游标9.3使用游标处理结果集第2种使用REPEAT循环。OPENcur;REPEATFETCHcurINTO…;IFdone!=1THEN #IF(NOTdone)THEN#处理语句;ENDIF;UNTILdoneENDREPEAT;CLOSEcur; #关闭游标9.3使用游标处理结果集9.3.5关闭游标CLOSEcursor_name;9.3使用游标处理结果集9.3.6游标的应用【例9-15】在studentinfo数据库中,创建存储过程up_cur_student,用游标获取student表中北京籍学生的学号、姓名和出生日期。1)创建存储过程up_cur_student,SQL语句如下:DROPPROCEDUREIFEXISTSproc_cur_student;CREATEPROCEDUREproc_cur_student()READSSQLDATABEGIN#定义接收游标数据的变量DECLAREvIDCHAR(12);DECLAREvNameVARCHAR(20);DECLAREvBirthdayDATE;DECLAREdoneBOOLEANDEFAULT0; #定义结束循环的标志变量9.3使用游标处理结果集#定义游标DECLAREcur_stCURSORFORSELECTStudentID,StudentName,BirthdayFROMstudentWHEREAddress='北京';DECLARECONTINUEHANDLERFORNOTFOUNDSETdone=1;OPENcur_st; #

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论