Ошибка PL / SQL «недостаточно значений» во время «выбора в» - PullRequest
1 голос
/ 04 октября 2019

Я работаю над созданием функции 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;

IЯ запустил его как запрос, и я получаю то, что ожидал, поэтому я не уверен, почему эта ошибка появляется. Любая помощь будет принята с благодарностью, так как я впервые работаю с pl / sql.

1 Ответ

1 голос
/ 05 октября 2019

Во-первых, вы не можете 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 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;

Поскольку тестовые данные не были предоставлены, я не проверял это - но по крайней мере он компилируется в dbfiddle .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...