为什么输出只是最后一个值? 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循环游标的主要内容,如果未能解决你的问题,请参考以下文章

oracle可不可以只取游标里面第一个值。 不想循环。

oracle存储过程中循环for in是如何使用的

Oracle 游标在最后一项中运行两次

MYSQL游标循环 最后多了一行一模一样的数据

oracle 隐式游标,显示游标,游标循环,动态SELECT语句和动态游标,异常处理,自定义异常

Oracle存储过程游标for循环怎么写