“选择”

时间:2019-10-04 19:24:34

标签: oracle plsql

我正在创建一个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。

1 个答案:

答案 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