Почему вывод только последнее значение? Курсор Oracle - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь вывести список курсов, которые преподает профессор, получая идентификатор профессора по параметру для моей функции и показывая все курсы, каждый из которых разделен запятой. Например, если профессор преподает гуманитарные науки, естествознание и математику, я хочу, чтобы результат был следующим: «Гуманитарные науки, естествознание, математика». Тем не менее, я получаю только «Математика». Он показывает только последнее найденное поле, совпадающее с идентификатором профессора.

CREATE OR REPLACE FUNCTION listar_cursos(prof NUMBER) RETURN VARCHAR
IS
    CURSOR C1 IS
        SELECT subject.name AS name FROM subject
               INNER JOIN course_semester 
               ON subject.id = course_semester.id_subject
        WHERE  course_semester.id_profesor = prof
        ORDER BY subject.name;

    test VARCHAR(500);
BEGIN
    FOR item IN C1
    LOOP
        test:= item.name ||',';
    END LOOP;

    RETURN test;
END;
/

Я знаю, что listagg существует, однако я не хочу его использовать.

1 Ответ

0 голосов
/ 31 августа 2018

В вашем цикле вы переопределяете переменную test вместо добавления к ней. Вот почему в конце цикла он будет содержать только последнее значение item.name.

Вместо этого назначение должно быть чем-то вроде

test := test || ',' || item.name

Обратите внимание, что в начале строки будет запятая. Вместо возврата test вы можете вернуть ltrim(test, ',').

Обратите внимание, что вам не нужно явно указывать курсор. Код легче читать (по моему мнению) с неявным курсором, как показано ниже. Я создаю образцы таблиц и данных для проверки функции, затем показываю код функции и ее использование.

create table subject as
  select 1 id, 'Humanities' name from dual union all
  select 2   , 'Science'         from dual union all
  select 3   , 'Math'            from dual
;

create table course_semester as
  select 1 id_subject, 201801 semester, 1002 as id_profesor from dual union all
  select 2           , 201702         , 1002 as id_profesor from dual union all
  select 3           , 201801         , 1002 as id_profesor from dual
;

CREATE OR REPLACE FUNCTION listar_cursos(prof NUMBER)  RETURN VARCHAR IS
 test VARCHAR(500);
BEGIN
FOR item IN 
(
  SELECT subject.name AS name FROM subject
      INNER JOIN course_semester 
  ON subject.id = course_semester.id_subject
  WHERE course_semester.id_profesor = prof
  ORDER BY subject.name
)
LOOP
  test:= test || ',' || item.name;
END LOOP;
RETURN ltrim(test, ',');
END;
/

select listar_cursos(1002) from dual;

LISTAR_CURSOS(1002)
-----------------------
Humanities,Math,Science
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...