17,380
社区成员
发帖
与我相关
我的任务
分享
create or replace procedure s_max_grade( teacher_id in number , class_name out varchar)
as
tmp_course number;
tmp_student number;
tmp_class number;
begin
select t.course_id into tmp_course from teacher t where t.teacher_id = teacher_id ;
select sc.student_id into tmp_student from student_course sc where sc.grade = (select max(student_course.grade) from student_course where student_course.course_id=tmp_course);
select s.class_id into tmp_class from student s where s.student_id= tmp_student;
select c.class_name into class_name from class c where c.class_id = tmp_class;
dbms_output.put_line(class_name);
end;
从错误中:
SQL错误:ORA-01422 实际返回的行数超出请求的行数
可以看出返回的t.course_id(tmp_course)不唯一,即有多个;
所以第二条语句的max(student_course.grade)不知道根据那个tmp_course来确定是哪一门课的最高成绩,既有多个最高成绩,这样就会有多个sc.student_id,oracle就不知道tmp_student应该存哪一个sc.student_id了。
再后面的语句也是一样的,连带错误!
select t.course_id into tmp_course from teacher t where t.teacher_id = teacher_id ;
select sc.student_id into tmp_student from student_course sc where sc.grade = (select max(student_course.grade) from student_course where student_course.course_id=tmp_course);
如果一个老师上的课不止一门,那么tmp_course就不止一个。
返回该老师所教课程,得分最高的那名学生的班级名字,你是指这个老师所教授的哪一门课程?
因为tmp_course不止一个,
所以:
select sc.student_id into tmp_student from student_course sc where sc.grade = (select max(student_course.grade) from student_course where student_course.course_id=tmp_course);
语句就会出错。
不知道我这样理解是否正确!