• 实验7 数据库编程


    第1关 定义一个名为PROC_COUNT的无参数存储过程

    任务描述
    定义一个名为PROC_COUNT的无参数存储过程,查询工程名称中含有“厂”字的工程数量,并调用该存储过程。

    相关知识
    1、工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。
    J表如下图:
    在这里插入图片描述
    现已构建J表,结构信息如下:
    在这里插入图片描述
    2、存储过程定义
    定义一个存储过程语句的语法格式如下:

    CREATE [OR REPLACE ] PROCEDURE <模式名.存储过程名> [WITH ENCRYPTION]
    [(<参数名>  <参数模式>  <参数数据类型> [<默认值表达式>]
    {,<参数名>  <参数模式>  <参数数据类型> [<默认值表达式>] })] 
    AS | IS
       [<说明语句端段>]
    BEGIN
      <执行语句段>
      [Exception
        <异常处理语句段>]
    END;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    其中:
    (1)<模式名.存储过程名>:指明被创建的存储过程的名称。
    (2)<参数名>:指明存储过程参数的名称。
    (3) WITH ENCRYPTION:为可选项,如果指定 WITH ENCRYPTION 选项,则对 BEGINEND 之间的语句块进行加密,防止非法用户查看其具体内容,加密后的存储过程或存储函数的定义可在 SYS.SYSTEXTS 系统表中查询。
    (4)<参数模式>:指明存储过程参数的输入/输出方式。参数模式可设置为 INOUTIN OUT(OUT IN),默认为 IN 类,IN 表示向存储过程传递参数,OUT表示从存储过程返回参数。而IN OUT表示传递参数和返回参数。 (5)<参数数据类型>:指明存储过程参数的数据类型。 (6)<说明语句端段>:由变量、游标和子程序等对象的申明构成。 (7)<执行语句段>:由SQL语句和过程控制语句构成的执行代码。 (8)<异常处理语句段>:各种异常的处理程序,存储过程执行异常时调用,可默认。 注意:使用该语句的用户必须是DBA或该存储过程的拥有者且具有CREATE PROCEDURE数据库权限的用户;参数的数据类型只能指定变量类型,不能指定长度。 相关操作: ①DECLARE定义变量 DECLARE用于定义变量,在存储过程和函数中通过declare定义变量在BEGIN…END`中,且在语句之前,定义变量语法为:

     DECLARE 变量名 变量类型 [DEFAULT 初始化值]
    • 1

    例如:

     DECLARE a, b INT DEFAULT 5;
    
    • 1

    SET定义用户变量
    SET语句可用于向系统变量或用户变量赋值,用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效,针对用户变量的定义如下:

    SET @var_name = expr [, @var_name = expr] ...
    
    • 1

    例如:

     SET @name = 'abc', @weight = 20;
    
    • 1

    ③ 存储过程调用:CALL命令 过程体调用CALL sp_name[(传参)];
    ④ 查看存储过程:SHOW PROCEDURE STATUS命令 SHOW PROCEDURE STATUS where db='数据库名'; 命令查看对应数据库中存在哪些存储过程
    ⑤ 存储过程修改:ALTER PROCEDURE命令 MySQL 中修改存储过程的语法格式如下: ALTER PROCEDURE 存储过程名 [ 特征 ... ] 注意:ALTER PROCEDURE 语句用于修改存储过程的某些特征。如果要修改存储过程的内容,可以先删除原存储过程,再以相同的命名创建新的存储过程;如果要修改存储过程的名称,可以先删除原存储过程,再以不同的命名创建新的存储过程。
    ⑥ 存储过程删除:DROP PROCEDURE命令 存储过程被创建后,就会一直保存在数据库服务器上,直至被删除。当 MySQL 数据库中存在废弃的存储过程时,我们需要将它从数据库中删除。 MySQL 中使用 DROP PROCEDURE
    语句来删除数据库中已经存在的存储过程。语法格式如下: DROP PROCEDURE [ IF EXISTS ] <过程名> 语法说明如下:
    • 过程名:指定要删除的存储过程的名称。
    IF EXISTS:指定这个关键字,用于防止因删除不存在的存储过程而引发的错误。
    注意:存储过程名称后面没有参数列表,也没有括号,在删除之前,必须确认该存储过程没有任何依赖关系,否则会导致其他与之关联的存储过程无法运行。
    OUT参数输出:SELECT @变量名 例:存储过程create procedure out_param(out p_out int);调用后输出OUT参数方法如下: CALL out_param(@pp_out); SELECT @pp_out;
    注意:pp_out可与 p_out同名
    ⑧ 修改命令结束符:DELIMITER命令
    在这里插入图片描述
    ⑨ 使用SELECT …INTO语句为变量赋值
    MySQL存储过程中,可以使用SELECT …INTO语句对变量进行赋值,该语句在数据库中进行查询,并将得到的结果赋值给变量。SELECT …INTO语句的语法格式如下:

     SELECT col_name[,...] INTO var_name[,...] table_expr
    
    • 1

    col_name:要从数据库中查询的列字段名;
    var_name:变量名,列字段名按照在列清单和变量清单中的位置对应,将查询得到的值赋给对应位置的变量;
    table_exprSELECT语句其余部分,包括可选的FROM子句和WHERE子句。 需要注意的是,在使用SELECT
    INTO语句时,变量名不能和数据表中的字段名不能相同,否则会出错。 例如:

    在这里插入图片描述

    ⑩ 将变量值返回给调用者
    在存储过程中定义的变量,经过一系列的处理之后,结果值可能需要返回给存储过程调用者。那么如何返回呢?方便的做法是使用SELECT语句将变量作为结果集返回,例如:
    在这里插入图片描述
    创建存储过程样例:创建一个存储过程,查询某用户ID在T表中的用户名
    在这里插入图片描述

    DELIMITER $
    CREATE PROCEDURE PROC_COUNT()
    BEGIN
    SELECT COUNT(*) FROM J WHERE JNAME LIKE '%厂';
    END ;$
    DELIMITER ;
    CALL PROC_COUNT();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    第2关 定义一个名为PROC_JNAME的有参数存储过程

    任务描述
    定义一个名为PROC_JNAME的有参数存储过程,查询输入任意城市的工程项目名称。

    DELIMITER $
    CREATE PROCEDURE PROC_JNAME(IN TEMPNAME CHAR(10))
    BEGIN
    SELECT JNAME FROM J WHERE J.CITY=TEMPNAME;
    END;$
    DELIMITER ;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    第3关 定义一个名为PROC_JINFO的有参数存储过程

    任务描述
    定义一个名为PROC_JINFO的有参数存储过程,查询输入任意城市的工程项目名称、零件名称以及各零件总数量,结果先按工程项目名称升序排序,再按零件名称升序排序。

    DELIMITER $
    CREATE PROCEDURE PROC_JINFO(IN TEMPNAME VARCHAR(10))
    BEGIN
    SELECT DISTINCT JNAME,PNAME,SUM(QTY) AS SUM_QTY
    FROM SPJ
    RIGHT JOIN J
    ON J.JNO = SPJ.JNO
    LEFT JOIN P
    ON P.PNO = SPJ.PNO
    WHERE CITY =  TEMPNAME
    GROUP BY SPJ.JNO,SPJ.PNO
    ORDER BY JNAME,PNAME;
    END ;$
    DELIMITER ;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    第4关 定义一个名为PROC_AVGGRADE的有参数存储过程

    任务描述
    定义一个名为PROC_AVGGRADE的有参数存储过程,统计任意一门课的平均成绩。
    相关知识
    1、课程表Course由课程号(Cno)、课程名(Cname)、先行课(Cpno)、学分(Ccredit)组成。
    Course表如下图:
    在这里插入图片描述
    现已构建Course表,结构信息如下:
    在这里插入图片描述
    创建Course表的Mysql代码为:

    CREATE TABLE Course(
        Cno CHAR(4) PRIMARY KEY,
        Cname CHAR(9),
        Cpno CHAR(4),
        Ccredit INT
    );
    
    INSERT INTO Course VALUES('1','数据库','5',4);
    INSERT INTO Course VALUES('2','离散数学','',2);
    INSERT INTO Course VALUES('3','信息系统','1',4);
    INSERT INTO Course VALUES('4','操作系统','6',3);
    INSERT INTO Course VALUES('5','数据结构','7',4);
    INSERT INTO Course VALUES('6','数据处理','',2);
    INSERT INTO Course VALUES('7','PaSCal语言','6',4);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2、学生选课表SC由学号(Sno)、课程号(Cno)、成绩(Grade)组成。
    SC表如下图:
    在这里插入图片描述
    现已构建SC表,结构信息如下:
    在这里插入图片描述
    创建SC表的Mysql代码为:

    CREATE TABLE SC(
        Sno CHAR(9),
        Cno CHAR(4),
        Grade INT,
        PRIMARY KEY(Sno, Cno)
    );
    
    INSERT INTO SC VALUES('200215121','1',92);
    INSERT INTO SC VALUES('200215121','2',85);
    INSERT INTO SC VALUES('200215121','3',88);
    INSERT INTO SC VALUES('200215122','2',90);
    INSERT INTO SC VALUES('200215122','3',80);
    INSERT INTO SC VALUES('200215123','1',60);
    INSERT INTO SC VALUES('200215123','2',75);
    INSERT INTO SC VALUES('200215124','1',52);
    INSERT INTO SC VALUES('200215124','2',63);
    INSERT INTO SC VALUES('200215125','1',100);
    INSERT INTO SC VALUES('200215125','2',100);
    INSERT INTO SC VALUES('200215126','2',34);
    INSERT INTO SC VALUES('200215126','3',45);
    INSERT INTO SC VALUES('200215127','2',86);
    INSERT INTO SC VALUES('200215127','3',88);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    DELIMITER $
    CREATE PROCEDURE PROC_AVGGRADE(IN TEMPNAME VARCHAR(10))
    BEGIN
    SELECT AVG(Grade) AS AVG_Grade
    FROM SC,Course
    WHERE Cname = TEMPNAME 
    AND Course.Cno=SC.Cno;
    END;$
    DELIMITER ;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    第5关 定义一个名为PROC_SINFO的有参数存储过程

    任务描述
    定义一个名为PROC_SINFO的有参数存储过程,查询输入任意供应商供应的工程项目名称、零件名称以及各零件总数量,结果先按工程项目名称升序排序,再按零件名称升序排序。

    DELIMITER $
    CREATE PROCEDURE PROC_SINFO(IN TEMPNAME VARCHAR(10))
    BEGIN
    SELECT DISTINCT JNAME,PNAME,SUM(QTY) AS SUM_QTY
    FROM SPJ
    RIGHT JOIN J
    ON J.JNO = SPJ.JNO
    RIGHT JOIN S
    ON S.SNO = SPJ.SNO
    LEFT JOIN P
    ON P.PNO = SPJ.PNO
    WHERE SNAME =  TEMPNAME
    GROUP BY SPJ.JNO,SPJ.PNO
    ORDER BY JNAME,PNAME;
    END ;$
    DELIMITER ;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    第6关 定义一个名为PROC_JSEARCH的有参数存储过程

    任务描述
    定义一个名为PROC_JSEARCH的有参数存储过程,当任意输入一个工程代号时,将返回供应该工程零件的供应商的名称(SNAME)和零件的名称(PNAME)以及工程的名称(JNAME),结果先按供应商名称升序排序,再按零件名称升序排序。

    DELIMITER $
    CREATE PROCEDURE PROC_JSEARCH(IN TEMPNAME CHAR(3))
    BEGIN
    SELECT DISTINCT SNAME,PNAME,JNAME
    FROM SPJ
    RIGHT JOIN J
    ON J.JNO = SPJ.JNO
    RIGHT JOIN S
    ON S.SNO = SPJ.SNO
    LEFT JOIN P
    ON P.PNO = SPJ.PNO
    WHERE J.JNO =  TEMPNAME
    GROUP BY SPJ.JNO,SPJ.PNO
    ORDER BY SNAME,PNAME;
    END ;$
    DELIMITER ;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    第7关 定义一个名为PROC_SUPDATE的有参数存储过程

    任务描述
    定义一个名为PROC_SUPDATE的有参数存储过程,按用户输入值更新“供应商表S”,根据输入的供应商代码,将S表中的供应商名称改为输入的供应商名称、城市名称改为输入的城市名称。
    注意存储过程的输入参数为供应商代码、供应商名称、城市名称。

    DELIMITER $
    CREATE PROCEDURE PROC_SUPDATE(IN SNOTEMP CHAR(3),IN SNAMETEMP CHAR(10),IN CITYTEMP CHAR(10))
    BEGIN
    UPDATE S
    SET SNO = SNOTEMP,SNAME = SNAMETEMP,CITY = CITYTEMP
    WHERE SNO = SNOTEMP;
    END;$
    DELIMITER ;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    第8关 定义一个名为PROC_AVGWEIGHT的有参数存储过程

    任务描述
    定义一个名为PROC_AVGWEIGHT的有参数存储过程,要求求出“用户输入的供应商”提供给“用户输入的工程”的“对应所有零件的平均重量”,并将平均重量结果通过输出变量AVG_WEIGHT返回,按照输入供应商为S2,工程为J1,执行上述存储过程。(注意要考虑零件数量)

    DELIMITER $
    CREATE PROCEDURE PROC_AVGWEIGHT(IN SNOTEMP CHAR(3),IN JNOTEMP CHAR(3),OUT TEMP INT(11))
    BEGIN 
    SELECT AVG(WEIGHT) INTO TEMP
    FROM P
    WHERE P.PNO IN(
    SELECT DISTINCT PNO
    FROM SPJ 
    WHERE SNO=SNOTEMP 
    AND JNO=JNOTEMP
    );
    END;$
    DELIMITER ;
    CALL PROC_AVGWEIGHT('S2','J1',@AVG_WEIGHT);
    SELECT @AVG_WEIGHT;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    第9关 定义一个名为PROC_JGRADE的有参数存储过程

    任务描述
    定义一个名为PROC_JGRADE的有参数存储过程,查看某个工程JNO使用零件数量的分布情况,按照S档<1000,M档1000-2000,L档>2000分段统计,按照输入某个工程JNO,输出为该工程号JNO的档次JTYPE

    DELIMITER $
    CREATE PROCEDURE PROC_JGRADE(IN JNOTEMP VARCHAR(10),OUT TEMP VARCHAR(10))
    BEGIN
    DECLARE NUMBER INT(4);
    SELECT SUM(QTY) INTO NUMBER
    FROM SPJ
    WHERE JNO =JNOTEMP;
    IF (NUMBER < 1000)
    THEN SET TEMP ='S';
    ELSEIF (NUMBER > 1000 & NUMBER < 2000)
    THEN SET TEMP ='M';
    ELSEIF (NUMBER > 2000)
    THEN SET TEMP ='L';
    END IF;
    END;$
    DELIMITER ;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    第10关 定义一个名为PROC_UPDATEGRADE的存储过程

    任务描述
    定义一个名为PROC_UPDATEGRADE的存储过程,将学生选课成绩从百分制改为等级制(即ABCDE),其中A为[90,100],B为[80,90),C为[70,80),D为[60,70),E为[0,60)。

    DELIMITER $
    CREATE PROCEDURE PROC_UPDATEGRADE()
    BEGIN
    UPDATE SC SET rank='A' WHERE Grade >=90 AND Grade<=100; 
    UPDATE SC SET rank='B' WHERE Grade >=80 AND Grade<90; 
    UPDATE SC SET rank='C' WHERE Grade >=70 AND Grade<80;  
    UPDATE SC SET rank='D' WHERE Grade >=60 AND Grade<70;
    UPDATE SC SET rank='E' WHERE Grade >=0 AND Grade<60;  
    END;$
    DELIMITER ;
    CALL PROC_UPDATEGRADE();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    第11关 使用游标定义一个名为PROC_JGRADE无参存储过程

    任务描述
    使用游标定义一个名为PROC_JGRADE无参存储过程,统计各工程使用零件数量的分布情况,按照S档<1000,M档1000-2000,L档>2000分段统计,即输出工程JNO、每个工程使用零件个数、每个工程使用零件个数的分档,结果按工程号JNO升序排序。
    相关知识
    1、供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,标识某供应商 供应某种零件 给某工程项目的数量为QTY
    SPJ表如下图:
    在这里插入图片描述
    现已构建SPJ表,结构信息如下:
    在这里插入图片描述
    2、游标
    游标的操作
    ① 游标的定义

    DECLARE 光标名称 CURSOR FOR 查询语法
    
    • 1

    例:

    DECLARE CURSOR_NAME CURSOR FOR SELECT_STATEMENT;
    
    • 1

    ② 打开游标

     OPEN 光标名称
    
    • 1

    例:

    OPEN CURSOR_NAME;
    
    • 1

    ③ 取游标中的数据

    FETCH 光标名称 INFO VAR_NAME [,VAR_NAME ].....
    
    • 1

    例:

    FETCH CURSOR_NAME INFO VAR_NAME;
    
    • 1

    ④ 关闭游标

     CLOSE 光标名称
    
    • 1

    例:

     CLOSE CURSO_NAME;
    
    • 1

    ⑤ 释放游标

    DEALLOCATE 光标名称
    
    • 1

    例:

    DEALLOCATE CURSOR_NAME;
    
    • 1

    游标使用示例: 使用游标创建一个存储过程,统计STUDENT表年龄大于19的记录的数量,如下为STUDENT表的创建代码:

     CREATE TABLE STUDENT(
        STUID INT PRIMARY KEY AUTO_INCREMENT,
        STUNAME VARCHAR(20),
        STUSEX VARCHAR(2),
        STUAGE INT
    );
    INSERT INTO STUDENT(STUNAME,STUSEX,STUAGE) VALUES
    ('小明','男',20),
    ('小花','女',19),
    ('大赤','男',20),
    ('可乐','男',19),
    ('莹莹','女',19);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    使用游标创建存储过程代码:

    DELIMITER $
    CREATE PROCEDURE PROC_STAT()
    BEGIN
        # 创建 用于接收游标值的变量
        DECLARE ID,AGE,TOTAL INT;
        DECLARE NAME,SEX CHAR(10);
        # 游标结束的标志
        DECLARE DONE INT DEFAULT 0;
        # 声明游标
        DECLARE CUR CURSOR FOR SELECT STUID,STUNAME,STUSEX,STUAGE FROM STUDENT WHERE STUAGE > 19;
        # 指定游标循环结束时的返回值 
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = 1;
        # 打开游标
        OPEN CUR;
        # 初始化变量
        SET TOTAL = 0;
        # WHILE 循环
        WHILE DONE != 1 DO
            FETCH CUR INTO ID,NAME,SEX,AGE;
              IF DONE != 1 THEN
                 SET TOTAL = TOTAL + 1;
              END IF;    
        END WHILE;
        # 关闭游标
        CLOSE CUR;
        # 输出累计的结果
        SELECT TOTAL;
    END$
    DELIMITER ;
    # 调用存储过程
    CALL PROC_STAT();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    DELIMITER $
    CREATE PROCEDURE PROC_JGRADE()
    BEGIN
    DECLARE PTYPE CHAR(10);
    DECLARE NJNO CHAR(10);
    DECLARE JNOTEMP INT DEFAULT 0;
    DECLARE QTYTEMP INT DEFAULT 0;
    DECLARE TEMP CURSOR FOR SELECT JNO,SUM(QTY)
    
    FROM SPJ 
    GROUP BY JNO 
    ORDER BY JNO;
    OPEN TEMP;
    CREATE TEMPORARY TABLE temp_table(
    SJNO CHAR(10) NOT NULL,
    SQTY CHAR(10) NOT NULL,
    JTYPE CHAR(10) NOT NULL
    );
    REPEAT 
    FETCH TEMP INTO NJNO,QTYTEMP;
    IF(QTYTEMP<1000)
    THEN
    SET PTYPE='S';
    ELSEIF(1000<=QTYTEMP AND QTYTEMP <=2000)
    THEN
    SET PTYPE='M';
    ELSEIF(QTYTEMP>2000)
    THEN
    SET PTYPE='L';
    END IF;
    INSERT INTO temp_table VALUES(NJNO,QTYTEMP,PTYPE);
    SET JNOTEMP =JNOTEMP+1;
    UNTIL JNOTEMP>=5
    END REPEAT;
    CLOSE TEMP;
    SELECT*FROM temp_table;
    END;$
    DELIMITER ;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    第12关 使用游标定义一个名为PROC_NUMGRADE有参存储过程

    任务描述
    使用游标定义一个名为PROC_NUMGRADE有参存储过程,统计某课程的成绩分布情况,即按照各分数段统计人数,按照100,[90,100),[80,90),[70,80),[60,70),[0,60)分段统计。
    相关知识
    1、课程表Course由课程号(Cno)、课程名(Cname)、先行课(Cpno)、学分(Ccredit)组成。
    Course表如下图:
    在这里插入图片描述
    现已构建Course表,结构信息如下:
    在这里插入图片描述
    创建Course表的Mysql代码为:

    CREATE TABLE Course(
        Cno CHAR(4) PRIMARY KEY,
        Cname CHAR(9),
        Cpno CHAR(4),
        Ccredit INT
    );
    
    INSERT INTO Course VALUES('1','数据库','5',4);
    INSERT INTO Course VALUES('2','离散数学','',2);
    INSERT INTO Course VALUES('3','信息系统','1',4);
    INSERT INTO Course VALUES('4','操作系统','6',3);
    INSERT INTO Course VALUES('5','数据结构','7',4);
    INSERT INTO Course VALUES('6','数据处理','',2);
    INSERT INTO Course VALUES('7','PaSCal语言','6',4);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2、学生选课表SC由学号(Sno)、课程号(Cno)、成绩(Grade)组成。
    SC表如下图:
    在这里插入图片描述
    现已构建SC表,结构信息如下:
    在这里插入图片描述
    创建SC表的Mysql代码为:

    CREATE TABLE SC(
        Sno CHAR(9),
        Cno CHAR(4),
        Grade INT,
        PRIMARY KEY(Sno, Cno)
    );
    
    INSERT INTO SC VALUES('200215121','1',92);
    INSERT INTO SC VALUES('200215121','2',85);
    INSERT INTO SC VALUES('200215121','3',88);
    INSERT INTO SC VALUES('200215122','2',90);
    INSERT INTO SC VALUES('200215122','3',80);
    INSERT INTO SC VALUES('200215123','1',60);
    INSERT INTO SC VALUES('200215123','2',75);
    INSERT INTO SC VALUES('200215124','1',52);
    INSERT INTO SC VALUES('200215124','2',63);
    INSERT INTO SC VALUES('200215125','1',100);
    INSERT INTO SC VALUES('200215125','2',100);
    INSERT INTO SC VALUES('200215126','2',34);
    INSERT INTO SC VALUES('200215126','3',45);
    INSERT INTO SC VALUES('200215127','2',86);
    INSERT INTO SC VALUES('200215127','3',88);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    DELIMITER $
    CREATE PROCEDURE PROC_NUMGRADE(IN TEMPCNAME CHAR(9))
    BEGIN
        # 创建 用于接收游标值的变量
        DECLARE TEMPGRADE INT;
        # 游标结束的标志
        DECLARE DONE INT DEFAULT 0;
        # 声明游标
        DECLARE CUR CURSOR FOR
        SELECT Grade
        FROM Course,SC
        WHERE Cname = TEMPCNAME AND Course.Cno = SC.Cno;
        # 指定游标循环结束时的返回值 
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = 1;
        # 创建临时表
        CREATE TEMPORARY TABLE TMEP_TABLE(
            Type CHAR(30),
            Num INT
        );
        INSERT INTO TMEP_TABLE VALUES('100', 0);
        INSERT INTO TMEP_TABLE VALUES('[90,100)', 0);
        INSERT INTO TMEP_TABLE VALUES('[80,90)', 0);
        INSERT INTO TMEP_TABLE VALUES('[70,80)', 0);
        INSERT INTO TMEP_TABLE VALUES('[60,70)', 0);
        INSERT INTO TMEP_TABLE VALUES('[0,60)', 0);
        # 打开游标
        OPEN CUR;
        # WHILE 循环
        WHILE DONE != 1 DO
            FETCH CUR INTO TEMPGRADE;
            IF DONE != 1 THEN
                IF TEMPGRADE=100 THEN UPDATE TMEP_TABLE SET Num=Num+1 WHERE Type='100';
                ELSEIF TEMPGRADE>=90 AND TEMPGRADE<100 THEN UPDATE TMEP_TABLE SET Num=Num+1 WHERE Type='[90,100)';
                ELSEIF TEMPGRADE>=80 AND TEMPGRADE<90 THEN UPDATE TMEP_TABLE SET Num=Num+1 WHERE Type='[80,90)';
                ELSEIF TEMPGRADE>=70 AND TEMPGRADE<80 THEN UPDATE TMEP_TABLE SET Num=Num+1 WHERE Type='[70,80)';
                ELSEIF TEMPGRADE>=60 AND TEMPGRADE<70 THEN UPDATE TMEP_TABLE SET Num=Num+1 WHERE Type='[60,70)';
                ELSEIF TEMPGRADE>=0 AND TEMPGRADE<60 THEN UPDATE TMEP_TABLE SET Num=Num+1 WHERE Type='[0,60)';
                END IF;  
            END IF; 
        END WHILE;
        # 关闭游标
        CLOSE CUR;
        # 输出累计的结果
        SELECT * FROM TMEP_TABLE;
    END;$
    DELIMITER ;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
  • 相关阅读:
    PyTorch模型定义和相关使用
    求一个网页设计作业——个人博客(HTML+CSS)
    【进程间通信:管道】
    Win10一键重装系统后计算机图标怎么调出来
    港陆证券:服装家纺公司上半年投资并购力度加大
    Spring Cloud(十四):微服务灰度发布 --- Discovery
    Leetcode题解——30. 包含min函数的栈(辅助栈思想)
    CSS居中对齐 (水平垂直居中对齐)
    【JavaSE】面向对象三大特性之多态
    eBPF学习笔记(一)—— eBPF介绍&内核编译
  • 原文地址:https://blog.csdn.net/weixin_51571728/article/details/128133977