1、 输入学生的学号,如果输入信息正确,则统计该学生所输入学生的学号,如果输入信息正确,则统计该学生所有科目的最高分有科目的最高分(使用使用return语句返回语句返回),并调用存储过程,并调用存储过程显示结果。显示结果。思考:如果上题还需返回学生不及格科目数,该如何操思考:如果上题还需返回学生不及格科目数,该如何操作?作?第七章第七章存储过程存储过程-输出参数输出参数存储过程的输出参数存储过程的输出参数创建带有参数的存储过程创建带有参数的存储过程(输出参数输出参数)存储过程调用存储过程存储过程调用存储过程 存储过程的参数分为存储过程的参数分为输入参数输入参数和和输出参数输出参数两种类型,输两种类
2、型,输入参数用于向存储过程中带入数据,而输出参数则能将存储入参数用于向存储过程中带入数据,而输出参数则能将存储过程中的数据返回到调用程序。过程中的数据返回到调用程序。在定义存储过程时在定义存储过程时,可以同时指定输入及输出参数:可以同时指定输入及输出参数:参数名参数名 数据类型数据类型=默认值默认值OUTPUT,.n创建存储过程创建存储过程prcGetAvgScore,用于根据给定的学号计算该学生所,用于根据给定的学号计算该学生所有课程的平均成绩,并使用输出参数返回平均成绩。有课程的平均成绩,并使用输出参数返回平均成绩。解决方案:解决方案:CREATE PROCEDURE prcGetAvgS
3、coreStuID char(10),),-学号,输入参数学号,输入参数 AvgScore float OUTPUT -成绩,输出参数成绩,输出参数ASBEGIN TRY IF EXISTS(select*from student where StuID=StuID)select AvgScore=avg(Grade)from SC where StuID=StuID ELSEprint the student does not exists!END TRYBEGIN CATCH PRINT ERROR RAISEDEND CATCH用户输入:用户输入:DECLARE AvgScore flo
4、atEXEC prcGetAvgScore A00001,AvgScore OUTPUTPRINT AvgScore 输入学生的学号,如果输入信息正确,则统计该学生所输入学生的学号,如果输入信息正确,则统计该学生所有科目的最高分和不及格的科目数,并将以上数据使用输出有科目的最高分和不及格的科目数,并将以上数据使用输出参数返回。参数返回。create proc prcGetStuGradeInfoStuID char(10),MaxScore float=0 output,FailCount int=0 outputasbegin tryif exists(select*from student
5、 where StuID=StuID)beginselect MaxScore=max(Score)from SCwhere StuID=StuID select FailCount=count(Score)from SC where StuID=StuID and Score=3)print 亲,您挂了,重头再来吧亲,您挂了,重头再来吧!elsebegindeclare Credit intselect Credit=sum(Credit)from SC join Course on SC.CourseID=Course.CourseIDwhere StuID=A00001 and Scor
6、e=60print Creditend有存储过程有存储过程A和和B,假设,假设B中需要调用存储过程中需要调用存储过程A,则存储过,则存储过程程B的参数列表中,一般情况下输入参数必须与存储过程的参数列表中,一般情况下输入参数必须与存储过程A的完全一致,且一一对应,的完全一致,且一一对应,A中的输出参数不在中的输出参数不在B中出现,中出现,如果如果B不再被其他存储过程调用,则不再被其他存储过程调用,则B中没有其他输出参数。中没有其他输出参数。create proc prcManageGradeInfoStuID char(10)Asbegin trydeclare MaxScore float d
7、eclare FailCount intexec prcGetStuGradeInfo StuID,MaxScore output,FailCount outputif(FailCount=3)print 亲,您挂了,重头再来吧亲,您挂了,重头再来吧!elsebegin declare Credit int select Credit=sum(Credit)from SC join Course on SC.CourseID=Course.CourseID where StuID=StuID and Score=60 print Credit print MaxScoreendend tryb
8、egin catch用户输入:用户输入:Exec prcManageGradeInfo A00001使用使用ALTER PROCEDURE语句修改存储过程语句修改存储过程语法:语法:ALTER PROC EDURE 存储过程名存储过程名 参数名参数名 数据类型数据类型 =默认值默认值 OUTPUT ,.n ASSQL语句语句 .n 使用使用DROP PROCEDURE 语句语句示例:写一个存储过程,查找某个学生是否选修了某门课程,如果选修示例:写一个存储过程,查找某个学生是否选修了某门课程,如果选修了则返回了则返回1,否则返回,否则返回0,错误返回,错误返回-1.解决方案:解决方案:CREAT
9、E PROC prcIsCourseSelectedStuID char(10),CourseID intAS BEGIN TRY if exists(select*from SC where StuID=StuID and CourseID=CourseID)return 1 else return 0 END TRY BEGIN CATCH return-1 END CATCH解决方案:解决方案:ALTER PROC prcManageIsCourseSelectedStuID char(10),CourseID intASDECLARE returnValue intEXEC retur
10、nValue=prcIsCourseSelected StuID,CourseIDIF returnValue=1BEGINDECLARE Grade floatSELECT Grade=Score FROM SC WHERE StuID=StuID AND CourseID=CourseIDPRINT GradeENDELSE IF returnValue=0PRINT 用户信息有误用户信息有误ELSEPRINT 程序出错程序出错再写一个存储过程调用上一存储过程,当返回值为再写一个存储过程调用上一存储过程,当返回值为1,显示选修成绩,显示选修成绩,为为0时提示用户信息有误,时提示用户信息有误
11、,-1时提示出错了。时提示出错了。写一个存储过程执行银行转账的功能,假设数据库中有账户表写一个存储过程执行银行转账的功能,假设数据库中有账户表Account(UserName,UserAccount),现要将用户,现要将用户A转账到用户转账到用户B一定的金额,一定的金额,完成存储过程。完成存储过程。create proc prcTransferOrginUser varchar(20),DesUser varchar(20),Money money As if exists(select*from Account where UserName=OrginUser)if exists(selec
12、t*from Account where UserName=DesUser)beginupdate Account set UserAccount=UserAccount-Money where UserName=OrginUserupdate Account Set UserAccount=UserAccount+Money where UserName=DesUser end.假设程序执行到第一个更新语句时断电假设程序执行到第一个更新语句时断电了?了?带有输出参数的存储过程带有输出参数的存储过程存储过程调用存储过程存储过程调用存储过程创建带有输出参数的存储过程创建带有输出参数的存储过程存储过程调用存储过程存储过程调用存储过程