В вашем цикле вы переопределяете переменную 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