资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,存储过程参数,使用输入参数执行存储过程,存储过程(,procedure,)类似于,C,语言中的函数,用来执行管理任务或应用复杂的业务规则,存储过程可以带参数,也可以返回结果,参数分为输入参数、输出参数,输入参数允许有默认值,创建不带参数的存储过程,问题:请创建存储过程,查看本次考试平均分以及未通过考试的学员名单,创建不带参数的存储过程,CREATE PROCEDURE,proc_stu,AS,DECLARE,writtenAvg,float,labAvg,float /*,笔试平均分和机试平均分变量,*/,SELECT,writtenAvg,=,AVG(writtenExam,),labAvg,=,AVG(labExam,)FROM,stuMarks,print 笔试平均分:+convert(varchar(5),writtenAvg),print 机试平均分:+convert(varchar(5),labAvg),IF(,writtenAvg,70 AND,labAvg,70),print本班考试成绩:优秀,/*,显示考试成绩的等级,*/,ELSE,print本班考试成绩:较差,print-,print参加本次考试没有通过的学员,:,SELECT,stuName,stuInfo.stuNo,writtenExam,LabExam,From,stuInfo,/*,查询没有通过考试的学员,*/,INNER JOIN,stuMarks,ON,stuInfo.stuNo,=,stuMarks.stuNo,WHERE,writtenExam,60,OR,L,abExam,60,创建带参数的存储过程,存储过程的参数分两种:,输入参数,输出参数,输入参数:用于向存储过程,传入,值,类似,C,语言的按值传递,;,输出参数:用于在调用存储过程后,,返回,结果,类似,C,语言的按引用传递,;,带输入参数的存储过程,通过参数名传递值,用,parameter=value,格式在,EXEC,语句中指定参数称为通过参数名传递值在通过参数名传递值时,参数可以以任何顺序指定,可以忽略允许空值和有默认的参数存在时(相当于覆盖了),.,带输入参数的存储过程,在以下情况下使用存储过程中定义的默认参数值:,在执行存储过程时没有给参数指定值,指定,default,关键字作为参数的值,带输入参数的存储过程,问题:,修改上例:由于每次考试的难易程度不一样,每次,笔试和机试的及格线,可能随时变化(不再是,60,分),这导致考试的评判结果也相应变化。,分析:,在述存储过程添加,2,个输入参数:,writtenPass,笔试及格线,labPass,机试及格线,带输入参数的存储过程,CREATE PROCEDURE proc_stu1,writtenPass,int,/*,输入参数:笔试及格线*,/,labPass,int,/*,输入参数:机试及格线*,/,AS,print,-,print,参加本次考试没有通过的学员:,SELECT,stuName,stuInfo.stuNo,writtenExam,labExam,From,stuInfo,/*,查询没有通过考试的学员,*,/,INNER JOIN,stuMarks,ON,stuInfo.stuNo,=,stuMarks.stuNo,WHERE,writtenExam,writtenPass,OR,labExam,labPass,带输入参数的存储过程,调用带参数的存储过程,假定本次考试机试偏难,机试的及格线定为,55,分,笔试及格线定为,60,分,调用过程,EXEC proc_stu1 60,55,-,或这样调用:,EXEC proc_stu1,labPass,=55,writtenPass=60,输入参数的默认值,带参数的存储过程确实比较方便,调用者可根据试卷的难易度,随时修改每次考试的及格线,问题:,如果试卷的难易程度合适,则调用者还是必须如此调用:,EXEC,proc_stu,60,60,,比较麻烦,这样调用就比较合理:,EXEC proc_stu1 55,笔试及格线,55,分,机试及格线默认为,60,分,EXEC proc_stu1,笔试和机试及格线都默认为标准的,60,分,输入参数的默认值,CREATE PROCEDURE proc_stu2,writtenPass,int,=60,/*,笔试及格线:默认为,60,分*,/,labPass,int,=60,/*,机试及格线:默认为,60,分*,/,AS,print,-,print,参加本次考试没有通过的学员:,SELECT,stuName,stuInfo.stuNo,writtenExam,LabExam,FROM,stuInfo,INNER JOIN,stuMarks,ON,/*,查询没有通过考试的学员,*,/,stuInfo.stuNo,=,stuMarks.stuNo,WHERE,writtenExam,writtenPass,OR,LabExam,labPass,输入参数的默认值,调用带参数默认值的存储过程,EXEC proc_stu2 -,都采用默认值,EXEC proc_stu2 64 -,机试采用默认值,EXEC proc_stu2 60,55 -,都不采用默认值,-,错误的调用方式:希望笔试采用默认值,机试及格线,55,分,EXEC proc_stu2 ,55,输入参数的默认值,-,正确的调用方式:,EXEC proc_stu2,labPass,=55,使用输入参数执行存储过程,通过定位传递参数,只进行值的传递(没有引用传递参数)称为通过定位传递参数当只指定一个值时,列出参数值在,CREATE PROCEDURE,语句中定义的顺序在通过定位传递参数时,可以忽略默认存在的参数,但是不可破坏次序,带输出参数的存储过程,如果希望调用存储过程后,返回一个或多个值,这时就需要使用输出,(,OUTPUT,),参数了,问题:,修改上例,返回未通过考试的学员人数。,带输出参数的存储过程,CREATE PROCEDURE,proc_stu,notpassSum,int,OUTPUT,writtenPass,int,=60,labPass,int,=60,AS,SELECT,stuName,stuInfo.stuNo,writtenExam,labExam,FROM,stuInfo,INNER JOIN,stuMarks,ON,stuInfo.stuNo,=,stuMarks.stuNo,WHERE,writtenExam,writtenPass,OR,labExam,labPass,SELECT,notpassSum,=,COUNT(stuNo,),FROM,stuMarks,WHERE,writtenExam,writtenPass,OR,labExam,labPass,declare number int,exec proc_stu number output,55,55,select number as,未通过人数,带输出参数的存储过程,
展开阅读全文