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

ata*_*ata 3 oracle plsql function 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;
Run Code Online (Sandbox Code Playgroud)

编译正常,但是当我想在 FOR 循环中使用该函数(通常将光标放在其中)时,出现以下错误

错误:PLS-00456:项目“f_get_cur”不是游标

我正在尝试像这样打开光标......

FOR cc_rec IN f_get_cur(c_date, p_c_code) LOOP
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*sej 5

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

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>
Run Code Online (Sandbox Code Playgroud)