为什么输出只是最后一个值? Oracle循环游标
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么输出只是最后一个值? Oracle循环游标相关的知识,希望对你有一定的参考价值。
我正在尝试输出教授教授的课程列表,通过参数将prof的id输入到我的函数中,并显示所有课程,每个课程用逗号分隔。例如,如果教授教授人文,科学和数学,我希望输出为:'人文,科学,数学'。但是,我只是'数学'。它只显示它找到的与prof的id匹配的最后一个字段。
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存在,但我不想使用它。
答案
在循环中,您重新分配给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
以上是关于为什么输出只是最后一个值? Oracle循环游标的主要内容,如果未能解决你的问题,请参考以下文章