触发器复习个人专用

互评批阅


    实验05 存储过程


    互评指标:

(1)请根据参考答案进行评分 (2)若题目有扣分,务必在评语框中写明扣分理由


    一. 简答题(共17题)


      1. (简答题) 本实验的实验目的是:

/***的答案:/

    掌握储存过程的概念,功能

    学会创造和调用储存过程

    知道修改和删除储存过程

/正确答案:/

    (1)掌握存储过程的概念、功能

    (2)学会创建和调用存储过程

    (3)知道如何修改和删除存储过程

评分 分
评语
段落格式
字体
字号
点击上传
x
        


      2. (简答题)

      请写出下列创建存储过程的MySQL语句,存储过程名命名为
      PROC_StuRepInfo_学号最后两位

      利用学生学号查询该名学生各学期的选修课程情况,要求显示学生的学号,
      姓名,选修的学年,学期,选修的课程号,课程名及其成绩,显示结果按学
      年和学期升序排列。

/***的答案:/

    delimiter $$
    create procedure jxdb09.PROC_StuReplnfo_09(in xh char(10),out Sno
    char(10))
    begin
       select S.Sno,Sname,Racademicyear,Rterm,C.Cno,Cname,Grade
           from students09 S,reports09 R,courses09 C
       where R.Sno=S.Sno and C.Cno=R.Cno and S.Sno=xh
       order by Racademicyear,Rterm;
    end $$
    delimiter ;

/正确答案:/

    DELIMITER //

    CREATE PROCEDURE PROC_StuRepInfo(

    Sid CHAR(10))

    BEGIN

        SELECT S.Sno, Sname, Racademicyear, Rterm, R.Cno, Cname, Grade

        FROM Students S, Reports R, Courses C

        WHERE S.Sno=R.Sno AND R.Cno=C.Cno

            AND S.Sno=Sid

        ORDER BY Racademicyear,Rterm;

    END //

    DELIMITER ;

评分 分
评语
段落格式
字体
字号
点击上传
x
        


      3. (简答题)

      请写出下列调用存储过程PROC_StuRepInfo_学号最后两位的MySQL语句,并
      将执行结果截图,截图的右下角要求标上你的学号最后两位

      查询学号为‘2015112101'的选课情况

/***的答案:/

    set @Stu=null;
    call PROC_StuReplnfo_09('2015112101',@Stu);


/正确答案:/

    CALL Proc_StuRepInfo('2015112101');


评分 分
评语
段落格式
字体
字号
点击上传
x
        


      4. (简答题)

      请写出下列创建存储过程的MySQL语句,存储过程名命名为PROC_StuGrade_
      学号最后两位

      查询某位学生指定课程的成绩和可获得这门课程的学分

      (注:若该学生的课程成绩小于60分或是为空,则学分要显示为0分)

/***的答案:/

    delimiter $$
    create procedure PROC_StuGrade_09(in Sn char(10),in Cn char(10))
    BEGIN

       DECLARE grade_09 CHAR(3);
       DECLARE credit_09 INT;

       select  Grade INTO grade_09
       from Reports09
       where Cno = (select Cno from courses09 where Cname = Cn) AND
             Sno = (SELECT Sno FROM Students09 WHERE Sname = SN);

      IF grade_09 < 60 OR grade_09 IS NULL THEN
       SET credit_09 = 0;
       ELSE
           SELECT Ceredit INTO credit_09 FROM Courses09 WHERE Cname=Cn ;
       END IF;

       select Sname,Cname,grade_09 ,credit_09
       from Courses09 C,Reports05 R,Students09 S
       where S.Sno =R.Sno and C.Cno = R.Cno and Sname=Sn and Cname=Cn;

    end $$

/正确答案:/

    DELIMITER //

    CREATE PROCEDURE PROC_StuGrade(

    SN VARCHAR(4),CN VARCHAR(20))

    BEGIN

        SELECT S.Sno,Sname,Cname,Grade,

            (CASE

                WHEN Grade<60 OR Grade IS NULL THEN 0

                ELSE Ccredit

             END) AS "Credit"

        FROM Students S INNER JOIN Reports R ON S.Sno=R.Sno

            INNER JOIN Courses C ON R.Cno=C.Cno

        WHERE S.Sname=SN AND C.Cname=CN;

    END //

    DELIMITER ;

评分 分
评语
段落格式
字体
字号
点击上传
x
        


      5. (简答题)

      请写出下列调用存储过程PROC_StuGrade_学号最后两位的MySQL语句,并将
      执行结果截图,截图的右下角要求标上你的学号最后两位

      (1)查询'张建国'选修的'数据库系统原理'课程的成绩和学分

      (2)查询'朱玉玲'选修的'计算机科学概论'课程的成绩和学分


/***的答案:/

    set @Sn = NULL and @Cn = NULL;
    call PROC_StuGrade_09('张建国','数据库系统原理',@Sn,@Cn);


    call PROC_StuGrade_09('朱玉玲','计算机科学概论',@Sn,@Cn);


/正确答案:/

    (1)CALL Proc_StuGrade('张建国','数据库系统原理');


    (2)CALL Proc_StuGrade('朱玉玲','计算机科学概论');


评分 分
评语
段落格式
字体
字号
点击上传
x
        


      6. (简答题)

      请写出下列创建存储过程的MySQL语句,存储过程名命名为
      PROC_DepNativeInfo_学号最后两位

      统计指定入学年级指定学院名中,各省的生源人数,要求显示入学年级,学
      院名,生源地(只显示省份)及生源人数。

/***的答案:/

    delimiter $$
    create procedure PROC_DepNativeInfo_09(in xn char(10),in dn
    char(20),out  name char(10),out  rs char(20))
    begin
    select left(Sno,4),Dname,left(Snative,2),count(*)
    from department09 D,students09 S
    where D.Dno=S.Dno and left(Sno,4)=xn and Dname=dn
    group by left(Sno,4), Dname, left(Snative,2);
    end $$
    delimiter;

/正确答案:/

    DELIMITER //

    CREATE PROCEDURE PROC_DepNativeInfo(

    StuGrd CHAR(4), DN VARCHAR(15))

    BEGIN

        SELECT LEFT(Sno,4) AS "入学年级", Dname AS "学院名",
    LEFT(Snative,2) AS "省份", COUNT(Sno) AS "生源数"

        FROM Students S, Department D

        WHERE S.Dno=D.Dno AND LEFT(Sno,4)=StuGrd

            AND Dname=DN

        GROUP BY LEFT(Snative,2),LEFT(Sno,4),Dname;

    END //

    DELIMITER ;

评分 分
评语
段落格式
字体
字号
点击上传
x
        


      7. (简答题)

      请写出下列调用存储过程PROC_DepNativeInfo_学号最后两位的MySQL语句,
      并将执行结果截图,截图的右下角要求标上你的学号最后两位

      查询2014级计算机与信息工程学院的生源情况

/***的答案:/

    set @xn=null and @dn=null;
    call PROC_DepNativeInfo_09('2014','计算机与信息工程学院',@xn,@dn);

/正确答案:/

    CALL PROC_DepNativeInfo('2014','计算机与信息工程学院');


评分 分
评语
段落格式
字体
字号
点击上传
x
        


      8. (简答题)

      请写出下列创建存储过程的MySQL语句,存储过程名命名为
      PROC_StuGradeNum_学号最后两位

      统计指定班级指定课程的考试情况,要求显示出不同分值段(10分为一个分
      值段)以及尚未考试的学生人数,如(100~90,2人;89~80,7人;…未考,2人)。

/***的答案:/

    delimiter $$
    create procedure PROC_StuGradeNum_09(in bj char(10),in kc
    char(20),out rs1 char(10),out rs2 char(10))
    begin
       select r.Cno,count(case when Grade>=90 and Grade<=100 then 1 end
    ) as '90~100',
          count(case when Grade>=80 and Grade<=90 then 1 end )'80~90',
          count(case when Grade>=70 and Grade<=80 then 1 end )'70~90',
          count(case when Grade>=60 and Grade<=70 then 1 end )'60~70',
          count(case when Grade>=50 and Grade<=60 then 1 end )'50~60',
          count(case when Grade>=40 and Grade<=50 then 1 end )'40~50',
          count(case when Grade>=30 and Grade<=40 then 1 end )'30~40',
          count(case when Grade>=20 and Grade<=30 then 1 end )'20~30',
          count(case when Grade>=10 and Grade<=20 then 1 end )'10~20',
          count(case when Grade>=0 and Grade<=10 then 1 end )'0~10',
          count(case when Grade=null then 1 end )'未考'
    from reports09 r,courses09 c
    where c.Cno=r.Cno and left(Sno,8)=bj and Cname=kc
    group by Cno;
    end $$
    delimiter;

/正确答案:/

    DELIMITER //

    CREATE PROCEDURE PROC_StuGradeNum(

    CLS CHAR(8), CN VARCHAR(20))

    BEGIN

        SELECT (CASE

                WHEN Grade BETWEEN 90 AND 100 THEN '90~100'

                WHEN Grade BETWEEN 80 AND 89 THEN '80~89'

                WHEN Grade BETWEEN 70 AND 79 THEN '70~79'

                WHEN Grade BETWEEN 60 AND 69 THEN '60~69'

                WHEN Grade BETWEEN 0 AND 59 THEN '0~59'

                ELSE '未考'

                END

    ) AS "成绩分段", COUNT(Sno) AS "分段人数"

    FROM Reports R,Courses C

    WHERE R.Cno=C.Cno AND LEFT(Sno,8)=CLS AND Cname=CN

    GROUP BY (CASE

              WHEN Grade BETWEEN 90 AND 100 THEN '90~100'

              WHEN Grade BETWEEN 80 AND 89 THEN '80~89'

              WHEN Grade BETWEEN 70 AND 79 THEN '70~79'

              WHEN Grade BETWEEN 60 AND 69 THEN '60~69'

              WHEN Grade BETWEEN 0 AND 59 THEN '0~59'

              ELSE '未考'

              END);

    END //

    DELIMITER ;

评分 分
评语
段落格式
字体
字号
点击上传
x
        


      9. (简答题)

      请写出下列调用存储过程PROC_StuGradeNum_学号最后两位的MySQL语句,并
      将执行结果截图,截图的右下角要求标上你的学号最后两位

      查询20152101班计算机科学概论的考试情况

      要求:若已获学分或未获学分返回为NULL,则结果要显示为0

/***的答案:/

    set @bj=null and @kc=null;
    call PROC_StuGradeNum_09('20152101','计算机科学概论',@bj,@kc);

/正确答案:/

    CALL PROC_StuGradeNum('20152101','计算机科学概论');


评分 分
评语
段落格式
字体
字号
点击上传
x
        


      10. (简答题)

      请写出下列创建存储过程的MySQL语句,存储过程名命名为
      PROC_StuCreditInfo_学号最后两位

      利用学生学号查询该名学生在指定学年,指定学期所获得的学分数以及还未
      获得的学分数,若该门课程尚无成绩或成绩小于60分,则为尚未获得的学
      分,结果以变量形式输出(OUTPUT)。

/***的答案:/

    delimiter $$
    create procedure PROC_StuCreditInfo_09(in xh10 char(10),in xn10
    char(10),in xq10 char(10))
    begin
    select Sno,Racademicyear,Rterm,sum(Ceredit)
       from Courses09 C,Reports09 R
       where C.Cno = R.Cno and Sno=xh10 and Racademicyear=xn10 and
    Rterm=xq10
       group by Racademicyear, Sno, Rterm;
    end $$
    delimiter;

/正确答案:/

    DELIMITER //

    CREATE PROCEDURE PROC_StuCreditInfo(

    SN CHAR(10), ADyear INT, TM INT, OUT GetCredits INT, OUT
    NotGetCredits INT)

    BEGIN

        SELECT SUM(Ccredit)

        FROM Reports R, Courses C

        WHERE R.Cno=C.Cno AND Sno=SN AND Racademicyear=ADyear

        AND Rterm=TM AND Grade>=60

        INTO GetCredits;


        SELECT SUM(Ccredit)

        FROM Reports R, Courses C

        WHERE R.Cno=C.Cno AND Sno=SN AND Racademicyear=ADyear

        AND Rterm=TM AND (Grade<60 OR Grade IS NULL)

        INTO NotGetCredits;

    END //

    DELIMITER ;

评分 分
评语
段落格式
字体
字号
点击上传
x
        


      11. (简答题)

      请写出下列调用存储过程PROC_StuCreditInfo_学号最后两位的MySQL语句,
      并将执行结果截图,截图的右下角要求标上你的学号最后两位

      (1)查询学号为2016115101的学生2017年第2学期的学分情况

      (2)查询学号为2014112104的学生2014年第1学期的学分情况

      要求:若已获学分或未获学分返回为NULL,则结果要显示为0

/***的答案:/

    set @xh10=null;
    call PROC_StuCreditInfo_09('2016115101','2017',2);


    set @xh10=null;
    call PROC_StuCreditInfo_09('2014112104','2014',1);


/正确答案:/

    (1)

    SET @GetCredit=0,@NotGetCredit=0;

    CALL PROC_StuCreditInfo('2016115101',2017,2,@GetCredit,@NotGetCredit);

    SELECT '2016115101' AS "学号",2017 AS "学年", 2 AS "学期",

        IFNULL(@GetCredit,0) AS "已获学分", IFNULL(@NotGetCredit,0) AS "
    未获学分";


    (2)

    SET @GetCredit=0,@NotGetCredit=0;

    CALL PROC_StuCreditInfo('2014112104',2014,1,@GetCredit,@NotGetCredit);

    SELECT '2014112104' AS "学号",2014 AS "学年", 1 AS "学期",

        IFNULL(@GetCredit,0) AS "已获学分", IFNULL(@NotGetCredit,0) AS "
    未获学分";


评分 分
评语
段落格式
字体
字号
点击上传
x
        


      12. (简答题)

      请写出下列创建存储过程的MySQL语句,存储过程名命名为PROC_TeaWork_学
      号最后两位

      统计指定教师指定学年的教学工作量(教学工作量=所有教授的课程学时数的
      总和),教学工作量要求作为输出参数(OUT)

/***的答案:/

    delimiter $$
    create procedure PROC_TeaWork_09(in tn13 char(20),in xn13 char(10))
    begin
       declare Chours_12 char(10);
       if Chour_12 is null then
           set Chours_12=0;
           else
           select Chours into Chours_12
           from courses09 c,tutors09 tu,teachers09 te
           where c.Cno=tu.Cno and te.Tno=tu.Tno and Tname=tn13 and
    Tacademicyear=xn13;
       end if ;

    select sum(Chours_12)
    from courses09 c,tutors05 tu,teachers09 te
    where c.Cno=tu.Cno and te.Tno=tu.Tno and Tname=tn13 and
    Tacademicyear=xn13
    group by te.Tno;
    end $$
    delimiter;

/正确答案:/

    DELIMITER //

    CREATE PROCEDURE PROC_TeaWork(

     TN VARCHAR(4), ADyear INT, OUT CouHours INT)

    BEGIN

        SELECT SUM(Chours)

        FROM Teachers T,Tutors TC,Courses C

        WHERE T.Tno=TC.Tno AND TC.Cno=C.Cno

            AND Tname=TN AND Tacademicyear=ADyear;

    END //

    DELIMITER ;


评分 分
评语
段落格式
字体
字号
点击上传
x
        


      13. (简答题)

      请写出下列调用存储过程PROC_TeaWork_学号最后两位的MySQL语句,并将执
      行结果截图,截图的右下角要求标上你的学号最后两位

      (1)查询教师刘伟2018学年的教学工作量

      (2)查询教师王一凡2016学年的教学工作量

      要求:若教学工作量返回为NULL,则结果要显示为0

/***的答案:/

    set @tn13=null;
    call PROC_TeaWork_09('刘伟','2018');


    call PROC_TeaWork_09('王一凡','2016');


/正确答案:/

    (1)

    SET @CourseHours=0;

    CALL PROC_TeaWork('刘伟',2018,@CourseHours);

    SELECT '刘伟' AS "教师姓名",2018 AS "学年",IFNULL(@CourseHours,0) AS
    "教学工作量";


    (2)

    SET @CourseHours=0;

    CALL PROC_TeaWork('王一凡',2016,@CourseHours);

    SELECT '王一凡' AS "教师姓名",2016 AS "学年",IFNULL(@CourseHours,0)
    AS "教学工作量";


评分 分
评语
段落格式
字体
字号
点击上传
x
        


      14. (简答题)

      请写出下列创建存储过程的MySQL语句,存储过程名命名为PROC_TeaTax_学
      号最后两位

      统计指定教师每月需要缴纳的税金是多少,并将统计结果以变量形式输出
      (OUT)

      如果是中级以下职称(含中级),则税金=(工资+岗位津贴-1500)*5%;

      如果是副高级职称,则税金=(工资+岗位津贴-2000)*5%;

      如果是正高级职称,则税金=(工资+岗位津贴-2500)*5%

      提示:IF… ELSE…

      注意:返回的税金应是实数

/***的答案:/

    delimiter $$

    create procedure PROC_TeaTax_05(in Tn char(10),out Ts char(20))

    begin

    select if(Tprof = '教授',(Tsal + Tcomm - 2500) * 5%,if(Tprof = '副教
    授',(Tsal + Tcomm - 2000) * 5%,(Tsal + Tcomm - 1500) * 5%)) from
    Teachers05 where Tn = Tname;

    end $$

    delimiter ;

    drop procedure if exists PROC_TeaTax_05;


/正确答案:/

    DELIMITER //

    CREATE PROCEDURE PROC_TeaTax(

     TN VARCHAR(4), OUT Ttax DECIMAL)

    BEGIN

        DECLARE tmp INT;

        DECLARE prof VARCHAR(8);

        SELECT Tprof  FROM Teachers

        WHERE Tname=TN

        INTO prof;


        IF (prof='教授') THEN

            SET tmp=2500;

        ELSEIF (prof='副教授') THEN

            SET tmp=2000;

        ELSE

            SET tmp=1500;

        END IF;


        SELECT (Tsal+Tcomm-tmp)*0.05 FROM Teachers

        WHERE Tname=TN

        INTO Ttax;

    END //

    DELIMITER ;

评分 分
评语
段落格式
字体
字号
点击上传
x
        


      15. (简答题)

      请写出下列调用存储过程PROC_TeaTax_学号最后两位的MySQL语句,并将执
      行结果截图,截图的右下角要求标上你的学号最后两位

      (1)查询教师张雪应缴纳的税金

      (2)查询教师田锋应缴纳的税金

      要求:显示的税金只保留小数点后两位

/***的答案:/

    set @TL = NULL ;

    call PROC_TeaTax_05('张雪',@TL);

    set @TL = NULL ;

    call PROC_TeaTax_05('田锋',@TL);

/正确答案:/

    (1)

    SET @Ttax=0.0;

    CALL PROC_TeaTax('张雪',@Ttax);

    SELECT '张雪' AS "教师姓名",FORMAT(@Ttax,2) AS "税金";


    (2)

    SET @Ttax=0.0;

    CALL PROC_TeaTax('田峰',@Ttax);

    SELECT '田峰' AS "教师姓名",FORMAT(@Ttax,2) AS "税金";


评分 分
评语
段落格式
字体
字号
点击上传
x
        


      16. (简答题)

      请写出下列创建存储过程的MySQL语句(选课情况综合查询),存储过程名命
      名为PROC_StuRepSel_学号最后两位

      此存储过程可按照用户指定的查询字段,包括学号,学生姓名,课程编号,
      课程名称、学年或班级编号查询学生的选课情况,查询结果显示(班级编
      号,学号,学生姓名,课程编号,课程名称,选修学年,选修学期,成绩)

      提示:需要两个输入参数,一个参数用来指定要查询的字段,另一个参数用
      来指定要查询字段的具体值,存储过程中需要根据查询字段不同,分别写出
      对应的查询语句

/***的答案:/

    delimiter $$
    create procedure PROC_StuRepSel_05(in An char(10),in Bn char(10),out
    Cn char(20))
    begin
    select Sclass,R.Sno,Sname,R.Cno,Cname,Racademicyear,Rterm,Grade
    from Students05 S,Reports05 R,Courses05 C
    where C.Cno = R.Cno and S.Sno = R.Sno and An in('学号','学生姓名','
    课程编号','课程名称','学年','班级编号') and Bn in
    (Sclass,R.Sno,Sname,R.Cno,Cname,Racademicyear);
    end $$
    delimiter ;

/正确答案:/

    DELIMITER //

    CREATE PROCEDURE PROC_StuRepSel(

     SelColumn VARCHAR(8), SelValue VARCHAR(30))

    BEGIN

        CASE SelColumn

        WHEN '学号' THEN

        BEGIN

            SELECT S.Sno,Sname,C.Cno,Cname,Racademicyear,Rterm,Grade

            FROM Students S,Reports R,Courses C

            WHERE S.Sno=R.Sno AND R.Cno=C.Cno

            AND S.Sno=SelValue;

        END;

        WHEN '学生姓名' THEN

        BEGIN

            SELECT S.Sno,Sname,C.Cno,Cname,Racademicyear,Rterm,Grade

            FROM Students S,Reports R,Courses C

            WHERE S.Sno=R.Sno AND R.Cno=C.Cno

            AND Sname=SelValue;

        END;

        WHEN '课程编号' THEN

        BEGIN

            SELECT S.Sno,Sname,C.Cno,Cname,Racademicyear,Rterm,Grade

            FROM Students S,Reports R,Courses C

            WHERE S.Sno=R.Sno AND R.Cno=C.Cno

            AND C.Cno=SelValue;

        END;

        WHEN '课程名称' THEN

        BEGIN

            SELECT S.Sno,Sname,C.Cno,Cname,Racademicyear,Rterm,Grade

            FROM Students S,Reports R,Courses C

            WHERE S.Sno=R.Sno AND R.Cno=C.Cno

            AND Cname=SelValue;

        END;

        WHEN '学年' THEN

        BEGIN

            SELECT S.Sno,Sname,C.Cno,Cname,Racademicyear,Rterm,Grade

            FROM Students S,Reports R,Courses C

            WHERE S.Sno=R.Sno AND R.Cno=C.Cno

            AND Racademicyear=CONVERT(SelValue,SIGNED);

        END;

        WHEN '班级编号' THEN

        BEGIN

            SELECT S.Sno,Sname,C.Cno,Cname,Racademicyear,Rterm,Grade

            FROM Students S,Reports R,Courses C

            WHERE S.Sno=R.Sno AND R.Cno=C.Cno

            AND Sclass=SelValue;

        END;

        ELSE

            SELECT '未找到对应字段' AS '错误';

        END CASE;

    END //

    DELIMITER ;

评分 分
评语
段落格式
字体
字号
点击上传
x
        


      17. (简答题)

      请写出下列调用存储过程PROC_StuRepSel_学号最后两位的MySQL语句,并将
      执行结果截图,截图的右下角要求标上你的学号最后两位

      (1)查询学号为2014112106的学生的选课情况

      (2)查询20141151班的学生的选课情况

      要求:显示的税金只保留小数点后两位

/***的答案:/

    set @TL = NULL ;
    call PROC_StuRepSel_05('学号','2014112106',@TL);
    call PROC_StuRepSel_05('班级编号','20141151',@TL);


/正确答案:/

    (1)CALL PROC_StuRepSel('学号','2014112106');

    (2)CALL PROC_StuRepSel('班级编号','20141151');

评分 分
评语
段落格式
字体
字号
点击上传
x
        

一. 简答题

  * 1
  * 2
  * 3
  * 4
  * 5
  * 6
  * 7
  * 8
  * 9
  * 10
  * 11
  * 12
  * 13
  * 14
  * 15
  * 16
  * 17

总分:0分
客观题得分:0分
提交 <javascript:;>

<javascript:;>

提示

<javascript:;> <javascript:;>
<javascript:;>

提示

<javascript:;> <javascript:;>

提示

<javascript:;>
<javascript:;>

评分量表模板详情

确定 <javascript:;> 取消 <javascript:;>

  • 31
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值