Sql 在存储过程中声明SYS_REFCURSOR和ROWTYPE

Sql 在存储过程中声明SYS_REFCURSOR和ROWTYPE,sql,oracle,stored-procedures,plsql,Sql,Oracle,Stored Procedures,Plsql,所以我有一个存储过程ONE create or replace PROCEDURE ONE ( A in number B in number ... ZZ out SYS_REFCURSOR ) IS SOME_OTHER_STUFF BEGIN ... END 这将返回一个sys_refcursor,其中包含我需要的一些数据。然后我有一个存储过程TWO create or replace PROCEDURE TWO ( A in number

所以我有一个存储过程
ONE

create or replace PROCEDURE ONE
(
   A in number
   B in number
   ...
   ZZ out SYS_REFCURSOR
) IS
  SOME_OTHER_STUFF
BEGIN
   ...
END
这将返回一个sys_refcursor,其中包含我需要的一些数据。然后我有一个存储过程
TWO

create or replace PROCEDURE TWO
(
   A in number
   B in number
   ...
   ZZ out SYS_REFCURSOR
) IS
     Count_Records Sys_Refcursor;
     l_rec Count_Records%rowtype;
BEGIN
    /* get some data from the ONE stored procedure to use on this procedure*/
    ONE(A,B,...Count_Records)

    Loop
       fetch count_records into l_rec;
       Exit When count_records%Notfound;
       If  l_rec.TT_RAW > MAX_RECORDS  Then
         Raise To_Many_Results;
       End If;
    End Loop;

END
当我试图声明rowtype
l_rec Count_记录%rowtype

如何声明此变量?问题是,我试图获取的列是一个总和,并且光标没有映射到任何包含大量计算的表


谢谢

您可以改为获取变量列表,或者创建自己的记录类型:

...
fetch count_records into v_field1, v_field2, v_field3
...

sys\u refcursor
的关键在于它是动态定义的。另一方面,
rowtype
声明必须是静态的(如果不是,编译器无法判断从它引用的字段是否有效)。这是一个用例的定义,在这个用例中,您应该定义自己的强类型ref cursor,而不是使用
sys\u refcursor

下面是一个非常简单的例子:

CREATE OR REPLACE PACKAGE BODY rc_example IS
   PROCEDURE two (a IN NUMBER, b IN NUMBER);
END rc_example;
/

CREATE OR REPLACE PACKAGE BODY rc_example IS
   TYPE one_record IS RECORD (FIRST_VALUE VARCHAR2 (10));

   TYPE one_cursor IS REF CURSOR
      RETURN one_record;

   --Could alternately be declared using a table's rowtype:
   --TYPE one_cursor is ref cursor return some_table%rowtype;

   PROCEDURE one (a IN NUMBER, b IN NUMBER, zz OUT one_cursor) IS
   BEGIN
      OPEN zz FOR SELECT 'test' FROM DUAL;
   END one;

   PROCEDURE two (a IN NUMBER, b IN NUMBER) IS
      count_records SYS_REFCURSOR;
      l_rec count_records%ROWTYPE;
   BEGIN
      one (a, b, count_records);

      LOOP
         FETCH count_records INTO l_rec;

         DBMS_OUTPUT.put_line (l_rec.FIRST_VALUE);
         EXIT WHEN count_records%NOTFOUND;
      END LOOP;
   END two;
END rc_example;
/

我试过你的方法,它成功了。谢谢你的帮助谢谢你的解释和详细的例子。我用了另一个对我有用的答案,所以我没有机会尝试你的,但我会考虑下一次我需要做这样的程序。顺致敬意,