数据库系统头歌实验七 数据库编程

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

工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。 J表如下图:

存储过程定义 定义一个存储过程语句的语法格式如下:

  1. CREATE [OR REPLACE ] PROCEDURE <模式名.存储过程名> [WITH ENCRYPTION]
  2. [(<参数名> <参数模式> <参数数据类型> [<默认值表达式>]
  3. {,<参数名> <参数模式> <参数数据类型> [<默认值表达式>] })]
  4. AS | IS
  5. [<说明语句端段>]
  6. BEGIN
  7. <执行语句段>
  8. [Exception
  9. <异常处理语句段>]
  10. END;
USE mydata;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE PROCEDURE P_NAME()
BEGIN
SELECT COUNT(*) FROM J WHERE JNAME LIKE '%厂';
END;$
DELIMITER ;
CALL P_NAME();
########## End ##########

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

工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。 J表如下图:

存储过程定义 定义一个存储过程语句的语法格式如下:

  1. CREATE [OR REPLACE ] PROCEDURE <模式名.存储过程名> [WITH ENCRYPTION]
  2. [(<参数名> <参数模式> <参数数据类型> [<默认值表达式>]
  3. {,<参数名> <参数模式> <参数数据类型> [<默认值表达式>] })]
  4. AS | IS
  5. [<说明语句端段>]
  6. BEGIN
  7. <执行语句段>
  8. [Exception
  9. <异常处理语句段>]
  10. END;
USE mydata;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE PROCEDURE PROC_JNAME(IN TEMP CHAR(10))
BEGIN
SELECT JNAME FROM J WHERE J.CITY=TEMP;
END;$
DELIMITER ;

########## End ##########
#以下代码禁止删除
CALL PROC_JNAME('天津');

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

零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成; P表如下图:

工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。 J表如下图:

供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,标识某供应商 供应某种零件 给某工程项目的数量为QTY。 SPJ表如下图:

存储过程定义 定义一个存储过程语句的语法格式如下:

  1. CREATE [OR REPLACE ] PROCEDURE <模式名.存储过程名> [WITH ENCRYPTION]
  2. [(<参数名> <参数模式> <参数数据类型> [<默认值表达式>]
  3. {,<参数名> <参数模式> <参数数据类型> [<默认值表达式>] })]
  4. AS | IS
  5. [<说明语句端段>]
  6. BEGIN
  7. <执行语句段>
  8. [Exception
  9. <异常处理语句段>]
  10. END;
USE mydata;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE PROCEDURE PROC_JINFO(IN TEMP 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=TEMP
GROUP BY SPJ.JNO,SPJ.PNO
ORDER BY JNAME,PNAME;
END;$
DELIMITER ;

########## End ##########
#以下代码禁止删除
CALL PROC_JINFO('天津');

第4关:定义一个名为PROC_AVGGRADE的有参数存储过程,统计任意一门课的平均成绩。

课程表Course由课程号(Cno)、课程名(Cname)、先行课(Cpno)、学分(Ccredit)组成。 Course表如下图:

学生选课表SC由学号(Sno)、课程号(Cno)、成绩(Grade)组成。 SC表如下图:

存储过程定义 定义一个存储过程语句的语法格式如下:

  1. CREATE [OR REPLACE ] PROCEDURE <模式名.存储过程名> [WITH ENCRYPTION]
  2. [(<参数名> <参数模式> <参数数据类型> [<默认值表达式>]
  3. {,<参数名> <参数模式> <参数数据类型> [<默认值表达式>] })]
  4. AS | IS
  5. [<说明语句端段>]
  6. BEGIN
  7. <执行语句段>
  8. [Exception
  9. <异常处理语句段>]
  10. END;
USE myschool;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE PROCEDURE PROC_AVGGRADE(IN TEMP VArCHAR(10))
BEGIN
SELECT AVG(Grade) AS AVG_Grade
FROM SC,Course
WHERE Cname=TEMP AND Course.Cno=SC.Cno;
END;$
DELIMITER ;
########## End ########## 
# 以下代码禁止删除
CALL PROC_AVGGRADE('数据库');

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

供应商表S由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)组成。 S表如下图:

零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成。 P表如下图:

工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。 J表如下图:

供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,标识某供应商 供应某种零件 给某工程项目的数量为QTY。 SPJ表如下图:

USE mydata;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE PROCEDURE PROC_SINFO(IN TEMP 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=TEMP 
GROUP BY SPJ.JNO,SPJ.PNO
ORDER BY JNAME,PNAME;
END;$
DELIMITER ;
########## End ##########
#以下代码禁止删除
CALL PROC_SINFO('精益');

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

供应商表S由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)组成。 S表如下图:

零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成。 P表如下图:

工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。 J表如下图:

供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,标识某供应商 供应某种零件 给某工程项目的数量为QTY。 SPJ表如下图:

USE mydata;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE PROCEDURE PROC_JSEARCH(IN TEMP CHAR(10))
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=TEMP
GROUP BY SPJ.JNO,SPJ.PNO
ORDER BY SNAME,PNAME;
END;$
DELIMITER ;
########## End ##########
#以下代码禁止删除
CALL PROC_JSEARCH('J2');

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

供应商表S由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)组成。 S表如下图:

USE mydata;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE PROCEDURE PROC_SUPDATE(IN TEMP1 CHAR(10),IN TEMP2 CHAR(10),IN TEMP3 CHAR(10))
BEGIN
UPDATE S
SET SNO=TEMP1,SNAME=TEMP2,CITY=TEMP3
WHERE SNO=TEMP1;
END;$
DELIMITER ;

########## End ########## 
#以下代码禁止删除
CALL PROC_SUPDATE('S4', '深技大', '深圳');
SELECT * FROM S;

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

零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成。 P表如下图:

供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,标识某供应商 供应某种零件 给某工程项目的数量为QTY。 SPJ表如下图:

USE mydata;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE PROCEDURE P_AVG(IN TEMP1 CHAR(10),IN TEMP2 CHAR(10),OUT TEMP3 INT(20))
BEGIN
SELECT AVG(WEIGHT)INTO TEMP3
FROM P
WHERE P.PNO IN(
    SELECT DISTINCT PNO
    FROM SPJ
    WHERE SNO=TEMP1 AND JNO=TEMP2
);
END;$
DELIMITER ;
CALL P_AVG('S2','J1',@AVG_WEIGHT);
SELECT @AVG_WEIGHT;


########## End ########## 

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

供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,标识某供应商 供应某种零件 给某工程项目的数量为QTY。 SPJ表如下图:

USE mydata;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE PROCEDURE PROC_JGRADE(IN TEMP1 VARCHAR(10),OUT TEMP2 VARCHAR(10))
BEGIN
DECLARE TEMP3 INT(10);
SELECT SUM(QTY)INTO TEMP3
FROM SPJ
WHERE JNO=TEMP1;
IF(TEMP3<1000) THEN SET TEMP2='S';
ELSEIF(TEMP3>1000 & TEMP3<2000)
THEN SET TEMP2='M';
ELSEIF(NUMBER>2000) THEN SET TEMP2='L';
END IF;
END;$
DELIMITER ;

########## End ##########
#以下代码禁止删除
CALL PROC_JGRADE('J1', @JTYPE);
SELECT @JTYPE;

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

学生选课表SC由学号(Sno)、课程号(Cno)、成绩(Grade)组成。 SC表如下图:

USE myschool;
#增加一列等级列
ALTER TABLE SC ADD `rank` CHAR(2);
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE PROCEDURE P_A()
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 P_A();

########## End ##########
#以下代码禁止删除
SELECT * FROM SC;

第11关:使用游标定义一个名为PROC_JGRADE无参存储过程,统计各工程使用零件数量的分布情况,按照S档<1000,M档1000-2000,L档>2000分段统计,即输出工程JNO、每个工程使用零件个数、每个工程使用零件个数的分档,结果按工程号JNO升序排序。

供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,标识某供应商 供应某种零件 给某工程项目的数量为QTY。 SPJ表如下图:

USE mydata;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE PROCEDURE PROC_JGRADE()
BEGIN
DECLARE TEMP1 CHAR(20);
DECLARE TEMP2 CHAR(20);
DECLARE TEMP3 INT DEFAULT 0;
DECLARE TEMP4 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(20) NOT NULL,SQTY CHAR(20) NOT NULL,JTYPE CHAR(20) NOT NULL);
REPEAT 
FETCH TEMP INTO TEMP2,TEMP4;
IF(TEMP4<1000)
THEN
SET TEMP1='S';
ELSEIF(1000<=TEMP4 AND TEMP4 <=2000)
THEN
SET TEMP1='M';
ELSEIF(TEMP4>2000)
THEN
SET TEMP1='L';
END IF;
INSERT INTO temp_table VALUES(TEMP2,TEMP4,TEMP1);
SET TEMP3 =TEMP3+1;
UNTIL TEMP3>=5
END REPEAT;
CLOSE TEMP;
SELECT*FROM temp_table;
END;$
DELIMITER ;

########## End ########## 
# 以下代码禁止删除
CALL PROC_JGRADE();

第12关:使用游标定义一个名为PROC_NUMGRADE有参存储过程,统计某课程的成绩分布情况,即按照各分数段统计人数,按照100,[90,100),[80,90),[70,80),[60,70),[0,60)分段统计。

课程表Course由课程号(Cno)、课程名(Cname)、先行课(Cpno)、学分(Ccredit)组成。 Course表如下图:

学生选课表SC由学号(Sno)、课程号(Cno)、成绩(Grade)组成。 SC表如下图:

USE myschool;
#请在此处添加实现代码
########## Begin ##########
DELIMITER $
CREATE PROCEDURE PROC_NUMGRADE(IN SUMTEMP CHAR(9))
BEGIN
    DECLARE TEMP1 INT;
    DECLARE TEMP2 INT DEFAULT 0;
    DECLARE TEMP3 CURSOR FOR
    SELECT Grade
    FROM Course,SC
    WHERE Cname = SUMTEMP AND Course.Cno = SC.Cno;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET TEMP2 = 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 TEMP3;
    WHILE TEMP2 != 1 DO
        FETCH TEMP3 INTO TEMP1;
        IF TEMP2 != 1 THEN
            IF TEMP1=100 THEN UPDATE TMEP_TABLE SET Num=Num+1 WHERE Type='100';
            ELSEIF TEMP1>=90 AND TEMP1<100 THEN UPDATE TMEP_TABLE SET Num=Num+1 WHERE Type='[90,100)';
            ELSEIF TEMP1>=80 AND TEMP1<90 THEN UPDATE TMEP_TABLE SET Num=Num+1 WHERE Type='[80,90)';
            ELSEIF TEMP1>=70 AND TEMP1<80 THEN UPDATE TMEP_TABLE SET Num=Num+1 WHERE Type='[70,80)';
            ELSEIF TEMP1>=60 AND TEMP1<70 THEN UPDATE TMEP_TABLE SET Num=Num+1 WHERE Type='[60,70)';
            ELSEIF TEMP1>=0 AND TEMP1<60 THEN UPDATE TMEP_TABLE SET Num=Num+1 WHERE Type='[0,60)';
            END IF;  
        END IF; 
    END WHILE;
    CLOSE TEMP3;
    SELECT * FROM TMEP_TABLE;
END;$
DELIMITER ;
########## End ########## 
# 以下代码禁止删除
CALL PROC_NUMGRADE('离散数学');
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stearm210

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值