Oracle 如何使用多个表循环SYS\u REFCURSOR?

Oracle 如何使用多个表循环SYS\u REFCURSOR?,oracle,stored-procedures,plsql,oracle9i,Oracle,Stored Procedures,Plsql,Oracle9i,对不起,这个问题的标题太宽泛了,但我没有找到进一步简化的方法 我正在为客户端创建一个包,这个包有一个过程,返回一个SYS\u REFCURSOR。为其提供信息的查询是一个包含大约20个字段的多表选择。在第二个过程中,我需要调用这个过程,并循环遍历结果以提供其他位置 在循环的部分使用时遇到问题。我无法使用表%ROWTYPE。我试图在过程中声明一个对象,但不允许。我需要做一个将XXX提取到单个变量列表中吗 DECLARE dt_field TABLE1.dt_field%TYPE;

对不起,这个问题的标题太宽泛了,但我没有找到进一步简化的方法

我正在为客户端创建一个包,这个包有一个过程,返回一个
SYS\u REFCURSOR
。为其提供信息的查询是一个包含大约20个字段的多表选择。在第二个过程中,我需要调用这个过程,并循环遍历结果以提供其他位置

在循环的
部分使用
时遇到问题。我无法使用
表%ROWTYPE
。我试图在过程中声明一个
对象
,但不允许。我需要做一个
将XXX提取到单个变量列表中吗

DECLARE
    dt_field TABLE1.dt_field%TYPE;
    p_resultset SYS_REFCURSOR;
    p_individual OBJECT ( 
     FIELD0         DATE,
     FIELD1         TABLE.FIELD1%TYPE,
     FIELD2         TABLE.FIELD2%TYPE,
     FIELD3         TABLE.FIELD3%TYPE,
     FIELD4         TABLE.FIELD4%TYPE
 );

 BEGIN
    PACKAGE.PROCEDURE1(dt_field);
    dbms_output.put_line(dt_field);
    PACKAGE.PROCEDURE2(dt_field, p_resultset);

   LOOP 
     -- this do not work
     FETCH p_resultset INTO p_individual;
     EXIT WHEN p_resultset%NOTFOUND;
     -- DO STUFF ON EACH RETURNED ROW
   END LOOP;
   CLOSE p_resultset;      
 END;

在我的评论之后,您不能在PL/SQL中创建对象类型,您需要声明一个记录类型,然后声明该类型的实例:

DECLARE
  type r_individual is record (
    FIELD0         DATE,
    FIELD1         TABLE1.FIELD1%TYPE,
    FIELD2         TABLE1.FIELD2%TYPE,
    FIELD3         TABLE1.FIELD3%TYPE,
    FIELD4         TABLE1.FIELD4%TYPE
  );
  p_individual r_individual;
...
您可以将ref游标提取到记录类型中。对象声明上的版本错误,而不是
获取

下面是一个基于您的问题的更完整的示例;我没有您的过程,因此我正在创建一个具有相同类型的虚拟结果集,并使用一个虚拟表来声明
%TYPE

create table table1(dt_field date, field1 number, field2 varchar2(1),
  field3 number, field4 varchar2(1));

set serveroutput on
DECLARE
  type r_individual is record (
    FIELD0         DATE,
    FIELD1         TABLE1.FIELD1%TYPE,
    FIELD2         TABLE1.FIELD2%TYPE,
    FIELD3         TABLE1.FIELD3%TYPE,
    FIELD4         TABLE1.FIELD4%TYPE
  );
  dt_field TABLE1.dt_field%TYPE;
  p_resultset SYS_REFCURSOR;
  p_individual r_individual;

BEGIN
  -- Don't have this package
  -- PACKAGE.PROCEDURE1(dt_field);
  -- dbms_output.put_line(dt_field);
  -- PACKAGE.PROCEDURE2(dt_field, p_resultset);

  -- Dummy result set for demo instead
  OPEN p_resultset FOR q'[select sysdate, 1, 'A', 3, 'C' from dual]'
    || q'[ union all select sysdate, 2, 'B', 4, 'D' from dual]';

  LOOP 
    FETCH p_resultset INTO p_individual;
    EXIT WHEN p_resultset%NOTFOUND;
    -- DO STUFF ON EACH RETURNED ROW
    DBMS_OUTPUT.PUT_LINE(p_individual.field1
      || ':' || p_individual.field2);
  END LOOP;
  CLOSE p_resultset;
END;
/
其中包括:

anonymous block completed
1:A
2:B

“我试图在过程中声明一个对象,但它不被允许”,这是您的企业策略的结果?由于缺乏所需的权限?或者它只是产生了某种错误?请看Alex Poole的回答:您需要在PL/SQL中声明一个记录类型,而不是一个对象,然后是该记录类型的一个实例。显示您得到的错误会很有帮助。我不确定您是否可以立即将ref游标提取到记录类型中。谢谢,伙计,这正是我失败的地方。从MySQL\MariaDB迁移是一项巨大的努力。仍在试图找到我的方法。出现:INTO列表中的表达式“P_INDIVIDUAL”是错误的type@delive-出现在哪里?这段代码在SQL*Plus和SQL Developer中运行时没有错误,同样是在11g和12c中。完整的ORA或PLS错误信息是什么?或者您的客户机/IDE本身正在生成它?如果您有一个无法解决的问题,您需要问一个新问题。@Alex Poole错误出现在“将p_结果集提取到p_个人”中;我有多个表,我得到这个错误。例如,在这个代码中有“TABLE1”,我有“TABLE1”,“TABLE2”,“TABLE3”,还有rowtype@delive-那么您还没有调整此选项以正确匹配您的查询。就像我说的,问一个新问题,显示您的表、您的代码版本以及您遇到的问题。