从 pl/sql 中的函数返回数据作为光标而不创建类型 oracle 11g

Posted

技术标签:

【中文标题】从 pl/sql 中的函数返回数据作为光标而不创建类型 oracle 11g【英文标题】:return data as cursor from function in pl/sql wiithout create type oracle 11g 【发布时间】:2013-11-24 06:57:02 【问题描述】:

我在 pl/sql 中写了这段代码,但我无法回答。

  create or replace function mostafa.sbs_Topic_LedgerBalance8Column
   (BranchID number,DateFrom number,DateTo number) 
 RETURN SYS_REFCURSOR 
  IS  O_RESULT SYS_REFCURSOR;

  BEGIN
  open O_RESULT for
     Select s* From Mostafa.topic ;


      RETURN O_RESULT;

end sbs_Topic_LedgerBalance8Column;

我这样称呼它:

DECLARE v_refcursor SYS_REFCURSOR;

BEGIN
v_refcursor :=mostafa.sbs_topic_ledgerbalance8column(12,12,12);

FOR employee_rec IN v_refcursor
   LOOP
      DBMS_OUTPUT.put_line (
         employee_rec.ID);
   END LOOP;
end;

为什么我在检索结果时会出错?

错误是:v_refcursor 不是过程或未定义

【问题讨论】:

说您“出错”但不告诉我们什么错误或您在哪里得到它对我们没有多大帮助。您的函数中有一些语法错误,但我猜您在发布问题时已经介绍了这些错误。您还没有告诉我们topic 表的定义。你到底想避免什么?您是否试图避免声明topic%rowtype 类型的变量?还是试图避免声明新类型? 在 for 游标循环中不允许使用游标变量(v_refcursor)。使用简单的 loop .. end loopopen, fetch, close 构造从该游标读取。 【参考方案1】:

当你使用一个 refcursor 时,你不能通过使用 cursor for 循环来访问它。请改用以下内容(未经测试):

DECLARE
    v_refcursor SYS_REFCURSOR;
    v_emp_rec topic%ROWTYPE;

BEGIN
    v_refcursor :=mostafa.sbs_topic_ledgerbalance8column(12,12,12);

    LOOP
        FETCH v_refcursor INTO v_emp_rec;
        EXIT WHEN v_refcursor%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(v_emp_rec.id);
    END LOOP;
    close v_refcursor;
END;

【讨论】:

感谢回复。函数的结果不是Topic表的类型。不创建类型可以获取数据吗? 不,函数的结果是一个引用。但是当您从表主题中选择 * 时,引用游标内的元素属于主题表中的行类型。如果您只选择列 ID 和 NAME,那么您必须 FETCH v_refcursor INTO v_emp_id、v_emp_name.. 或类似的东西

以上是关于从 pl/sql 中的函数返回数据作为光标而不创建类型 oracle 11g的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL自定义函数

PL SQL 中的游标

在 Java 中调用 Oracle PL/SQL 中的过程或函数。返回结果集 false

如何从 Oracle PL/SQL 函数中返回现有表中的记录?

带有参数的 PL/SQL 过程/函数从选择查询返回表

PL/SQL - 动态访问光标数据