在PL SQL中返回游标的函数,

时间:2019-04-30 09:27:54

标签: oracle function plsql cursor

我有一个返回SYS_REFCURSOR的函数,该函数将从不同的包中调用,我们不想在多个位置重复游标定义。

FUNCTION f_get_cur(p_date DATE, p_code VARCHAR(10)) RETURN SYS_REFCURSOR IS
  cur_s SYS_REFCURSOR;
BEGIN
  OPEN cur_s FOR
    SELECT .blah blah etc etc

  return cur_s;
END f_get_cur;

哪个可以编译,但是当我想在通常要放置光标的FOR LOOP中使用该函数时,会出现以下错误

  

错误:PLS-00456:项目'f_get_cur'不是光标

我正试图像这样打开游标...

FOR cc_rec IN f_get_cur(c_date, p_c_code) LOOP

我使用的数据类型错误吗?还有其他实现我正在尝试的方法的方法吗?

2 个答案:

答案 0 :(得分:4)

您需要以其他方式处理返回的游标;例如:

SQL> create or replace FUNCTION f_get_cur(p_date DATE, p_code VARCHAR) RETURN SYS_REFCURSOR IS
  2    cur_s SYS_REFCURSOR;
  3  BEGIN
  4    OPEN cur_s FOR
  5      SELECT to_char(p_date, 'dd-mm-yyyy') || p_code val from dual;
  6
  7    return cur_s;
  8  END f_get_cur;
  9  /

Function created.

SQL> declare
  2        cur_s SYS_REFCURSOR;
  3        v     varchar2(100);
  4  begin
  5      cur_s := f_get_cur(sysdate, 'xx');
  6      loop
  7          fetch cur_s into v;
  8          exit when cur_s%NOTFOUND;
  9          dbms_output.put_line(v);
 10      end loop;
 11  end;
 12  /
30-04-2019xx

PL/SQL procedure successfully completed.

SQL>

答案 1 :(得分:0)

我设法通过创建另一个(!)游标来实现此功能,该游标实现了我已经创建的功能(包装了原始游标)

cursor cur_real(cp_date DATE, cd_code VARCHAR2(10)) IS
  select ... etc
FROM TABLE(f_get_cur(cp_date, cp_code));

我现在可以像这样使用光标

FOR cc_rec IN f_get_cur(c_date, p_c_code) LOOP
   do stuff ... etc
END LOOP