我正在创建一个pl / sql函数,该函数从班级列表中查找学生的最高平均水平。我的平均计算部分工作正常;但是,我需要将结果作为记录表返回,并且在尝试将结果存储到记录中时遇到错误。
我的记录声明如下
create or replace TYPE studentRec as object (
term varchar2(10),
lineNum number(4),
coTitle varchar2(50),
stuId varchar2(5),
average number);
当我尝试使用select into
语句填充记录时出现错误。
create or replace function highest_avg(stu_id scores.sid%type,
line_no scores.lineno%type)
return stuRecTab
as
stuRec stuRecTab;
average number;
studentRec_t studentRec;
begin
stuRec := stuRecTab();
select avg(points)
into average
from scores, courses
where scores.sid = stu_id
and scores.lineno = line_no
and scores.term = courses.term
and scores.lineno = courses.lineno;
SELECT DISTINCT c.term, c.lineno, cc.ctitle, s.sid, average
INTO studentRec_t
from courses c, class_catalog cc, scores s
where s.sid = stu_id
and s.lineno = line_no
and s.term = c.term
and s.lineno = c.lineno
and c.cno = cc.cno;
stuRec := studentRec_t;
return(stuRec);
end;
我已将其作为查询运行,但我又得到了我期望的结果,所以我不确定为什么会弹出此错误。任何帮助将不胜感激,因为这是我第一次使用pl / sql。
答案 0 :(得分:1)
首先,您无法SELECT INTO
对象实例变量的字段-您必须在自己的选择中创建一个对象实例,然后将其选择为INTO您的对象实例变量。您不能简单地将实例变量分配给集合-您需要将其放在适当的索引处。所以最终得到的是这样的:
create or replace function highest_avg(stu_id scores.sid%type,
line_no scores.lineno%type)
return stuRecTab
as
stuRec stuRecTab;
average number;
studentRec_t studentRec;
begin
stuRec := stuRecTab();
select avg(points)
into average
from scores s
inner join courses c
on c.term = s.term and
c.lineno = s.lineno
where s.sid = stu_id and
s.lineno = line_no;
SELECT studentRec(term, lineno, ctitle, sid, average)
INTO studentRec_t
FROM (SELECT DISTINCT c.term, c.lineno, cc.ctitle, s.sid, average
from scores s
INNER JOIN courses c
ON s.term = c.term and
s.lineno = c.lineno
INNER JOIN class_catalog cc
ON cc.cno = c.cno
where s.sid = stu_id and
s.lineno = line_no);
stuRec(1) := studentRec_t;
return(stuRec);
end;
由于未提供测试数据,因此我尚未测试-至少it compiles at dbfiddle。