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

Posted

技术标签:

【中文标题】在 PL SQL 中返回游标的函数,【英文标题】:Function to return a cursor in PL SQL, 【发布时间】:2019-04-30 09:27:53 【问题描述】:

我有一个返回 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

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

【问题讨论】:

【参考方案1】:

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

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>

【讨论】:

我的代码在一个包中,当我尝试声明一个 SYS_REFCURSOR 时,我收到错误...“PLS-00103:在预期以下之一时遇到符号“SYS_REFCURSOR”。 .等等等等” 这听起来像是包中的语法错误。您需要将答案中的匿名代码块包装到包中的适当函数或过程中。 代码 is 包装在一个过程中,这就是我在上面得到 PLS-00103 错误的地方【参考方案2】:

我设法通过创建另一个(!)游标来实现我已经创建的函数(它包装了原始游标)

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

【讨论】:

以上是关于在 PL SQL 中返回游标的函数,的主要内容,如果未能解决你的问题,请参考以下文章

如何在 pl/sql 过程中使用游标返回多行和多列?

oracle-游标-存储过程-函数-包

PL/SQL 打印出存储过程返回的引用游标

PL/SQL:游标使用中的 ORA-01001

Oracle Pl/sql 从多个查询中返回一个游标

如何检查 ref 游标是不是从 pl/sql 过程返回数据