本关任务:编写函数fun_1完成学生选课操作。输入参数:学号、课程名,函数返回值:操作结果。
在代码文件“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
- 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
- use DB1;
-
- #请在此处添加函数调用代码
- #实参值为
- #学号:2019081008
- #课程名:PASCAL语言
- ########## Begin ##########
-
-
- select fun_1('2019081008','PASCAL语言');
-
- ########## End ##########
总结:掌握数据库函数的声明,熟练运用INSERT语句向表中插入信息。