Oracle 使用游标创建函数

Oracle create function using cursors

我需要创建一个函数,在该函数中我必须将查询结果作为输入传递给由 space 连接的输出查询。下面的代码大概写了。在修改函数方面需要帮助。

CREATE or replace FUNCTION GETPGM(Year IN Number, ID IN Number)
RETURN VARCHAR2 IS
result  VARCHAR2(200);

cursor getterm is
      select term_code from table_term 
      where proc_yr = Year;
      
BEGIN
loop
fetch cur into TERM;
exit when cur%NOTFOUND;
select f_getp (ID,:TERM1,Year)||' ' f_getp (ID,:TERM2,Year) from dual -- output Result set

end loop;
RETURN result;
END;

如有任何疑问,请告诉我。

不清楚 TERM1 和 TERM2 是什么(参数?如果是,您应该将它们传递给函数),也不清楚结果应该是什么。

无论如何,看看这样的事情是否有帮助:

CREATE OR REPLACE FUNCTION getpgm (par_year   IN NUMBER,
                                   par_id     IN NUMBER,
                                   par_term1  IN NUMBER,
                                   par_term2  IN NUMBER)
   RETURN VARCHAR2
IS
   result  VARCHAR2 (200);
BEGIN
   FOR cur_r IN (SELECT term_code
                   FROM table_term
                  WHERE proc_yr = par_year)
   LOOP
      result :=
            result
         || ' '
         || f_getp (par_id, par_term1, par_year)
         || ' '
         || f_getp (par_id, par_term2, par_year);
   END LOOP;

   RETURN result;
END;
  • result 应该与其“先前”值连接(否则,您将得到最后一个游标的值作为结果,而不是 everything
  • 使用游标 FOR 循环,因为 Oracle 会为您完成所有肮脏的工作(您不必声明游标变量,打开游标,从中获取,担心退出循环,关闭游标- 请注意,您的代码中应该没有很多东西)
  • 注意return值的数据类型;一个长度为 200 个字符的字符串是否足够?结果将是一些值的 space-separated 列表。您不想 return 引用游标还是集合?

如果要将 f_getp 函数应用于查询结果的每一行并将结果连接成 space 分隔字符串,则不需要使用游标,可以使用 LISTAGG:

CREATE FUNCTION GETPGM(
  i_year IN table_term.proc_yr%type,
  i_id   IN Number
) RETURN VARCHAR2
IS
  result  VARCHAR2(200);
BEGIN
  SELECT  LISTAGG(f_getp(i_id, term_code, i_year), ' ') WITHIN GROUP (ORDER BY term_code)
  INTO    result
  FROM    table_term 
  WHERE   proc_yr = i_year;

  RETURN result;
END;
/