【2023.10.25练习】数据库-函数1

任务描述

本关任务:编写函数fun_1完成学生选课操作。输入参数:学号、课程名,函数返回值:操作结果。

  • 如果该生已有该门课程的选修记录,则函数返回-1;
  • 如果该门课程无先修课,则将选课信息添加到选课表中,函数返回1;
  • 如果该门课程有先修课,且该生已选修该先修课,则将选课信息添加到选课表中,函数返回1;
  • 如果该门课程有先修课,但该生未选修该先修课,则返回0。

编程要求

在代码文件"step2/query1.sql"中实现函数fun_1; 在代码文件"step2/query2.sql"中使用select命令实现对函数的调用。

涉及的表和字段:

学生表(student) : 学号(sno) char(10) 姓名(sname) varchar(50) 性别(ssex) char(2) 出生日期(sbirth) date 所在系(sdept) varchar(20)
课程表(course) : 课程号(cno) char(4) 课程名(cname) varchar(50) 先行课(cpno) char(4) 学分(credit) decimal(3,1) 学期(semester) smallint
选修表(sc): 学号(sno) char(10) 课程号(cno) char(4) 成绩(grade) smallint


设计重点:

函数的声明 ,用create function来书写函数,记得附加return返回值类型。函数主体从begin 到end。

在query2.sql中使用select fun_1来调用函数。


最终代码:

query1.sql

sql 复制代码
use DB1;

delimiter $$
#请在此处添加函数实现代码
#请注意参数顺序需要与题目要求一致
########## Begin ##########

create function fun_1(v_sno char(10), v_cname varchar(50))
returns int
begin
    DECLARE v_count int;
    DECLARE v_cpno CHAR(4);

/*PART 1 判断该学生是否选择该课*/
    SELECT COUNT(*) INTO v_count
    FROM sc
    WHERE sno = v_sno AND cno = 
    (SELECT cno FROM course WHERE cname = v_cname);

    IF v_count > 0 then
    RETURN -1;
    END IF;

/*PART 2 检查该课的先修课*/
    SELECT cpno INTO v_cpno
    FROM course
    WHERE cname = v_cname;/*选出该课的先修课*/

    IF v_cpno IS NULL then
    INSERT INTO sc(sno,cno)
    VALUES (v_sno,(SELECT cno FROM course WHERE cname = v_cname));
    RETURN 1;
    /*添加选课信息*/
END IF;
 
 /*PART 3 检查该生是否已选修过该课程的先修课*/
SELECT COUNT(*) INTO v_count
FROM sc
WHERE sno = v_sno AND cno = v_cpno;

IF v_count > 0 then
   INSERT INTO sc(sno,cno)
   VALUES (v_sno,(SELECT cno FROM course WHERE cname = v_cname));
   RETURN 1;
else
   RETURN 0;
END IF;



end $$
########## End ##########  
delimiter ; #恢复分号来作为语句标识。 

query2.sql

sql 复制代码
use DB1;

#请在此处添加函数调用代码
#实参值为
#学号:2019081008
#课程名:PASCAL语言
########## Begin ##########


select fun_1('2019081008','PASCAL语言');

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

**总结:**掌握数据库函数的声明,熟练运用INSERT语句向表中插入信息。

相关推荐
zyseo85 小时前
谷歌SEO 准首页词挖掘脚本:找出排在第 8-20 名的隐藏流量
大数据·数据库·人工智能
xiaogai_gai7 小时前
仅查询策略实战:从金蝶云·星空旗舰版定时拉取收料通知单
大数据·数据库·python
数据工匠老o8 小时前
异构数据库DDL同步:260条链路的结构变更自动适配方案
数据库·架构
阿里云大数据AI技术8 小时前
StarRocks 与 Fluss 用一条 SQL 查实时与历史
人工智能·sql
这个DBA有点耶8 小时前
银行业市占率最高的国产数据库是谁?先搞清楚“市占率”的四种口径
数据库·程序员·架构
用户6279947182629 小时前
南大通用GBase 8a之基于审计日志的冷温热数据分析
数据库
数据库小学妹9 小时前
数据库运维五级成熟度:监控、备份、高可用怎么串起来
运维·数据库·监控
一个天蝎座的程序猿9 小时前
为了给报表提速,我把金仓KES的列存储折腾了个遍:聊聊KES的技术能力
数据库
飞越未来云城的霓虹飞猪9 小时前
AI 数据库地图:从 PostgreSQL 到向量数据库,一次看懂 AI 时代的数据底座
数据库
不像程序员的程序媛9 小时前
导出mysql数据结构
数据库·mysql