【问题标题】:ORA-01001: invalid cursor . Passing cursor to a procedureORA-01001: 无效游标。将游标传递给过程
【发布时间】:2021-11-26 19:02:09
【问题描述】:

当我执行下面的代码时,我得到了ORA-01001: invalid cursorORA-06512 错误。情况并非总是如此。我以为我通过引用将光标传递给MY_READ 过程并可以在那里关闭它。但是当我突然开始遇到上面的错误时,我得出结论,也许我没有传递引用而是光标的副本。我对吗? MY_READ函数中是否可以读取关闭光标?

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PROCEDURE REP_HELPER1 (myIdx IN BINARY_INTEGER, from_d IN DATE, rep_table IN OUT rep_table_T) IS
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
           
myCUR1 SYS_REFCURSOR; 
            
BEGIN              
         OPEN myCUR1 FOR SELECT     myField1,
                                    myField2,
                                    myField3,
                                    myField4,
                                    myField5,
                                    myField6,
                                    myField7,
                                    myField8,
                                    myField9,
                                    myField10,
                                    myField11,
                                    myField12,
                                    myField13,
                                    myField14,
                                    myField15,
                                    myField16,
                                    myField17,
                                    myField18,
                                    myField19,
                                    myField20,
                                    myField21,
                                    myField22,
                                    myField23,
                                    myField24,
                                    myField25,
                                    myField26,
                                    myField27,
                                    myField28,
                                    myField29,
                                    myField30,
                                    myField31
                               FROM myTable;
     MY_READ(myIdx , myCUR1, rep_table) 
 END  REP_HELPER1; 

--Am I passing here a copy of a cursor and not a reference?        
PROCEDURE MY_READ(myIdx IN BINARY_INTEGER, cur IN SYS_REFCURSOR, rep_table IN OUT rep_table_T) IS
BEGIN
         
      FETCH cur INTO rep_table(myIdx).day1,  rep_table(myIdx).day2,  rep_table(myIdx).day3,  rep_table(myIdx).day4,  rep_table(myIdx).day5,
                                      rep_table(myIdx).day6,  rep_table(myIdx).day7,  rep_table(myIdx).day8,  rep_table(myIdx).day9,  rep_table(myIdx).day10,
                                      rep_table(myIdx).day11, rep_table(myIdx).day12, rep_table(myIdx).day13, rep_table(myIdx).day14, rep_table(myIdx).day15,
                                      rep_table(myIdx).day16, rep_table(myIdx).day17, rep_table(myIdx).day18, rep_table(myIdx).day19, rep_table(myIdx).day20,
                                      rep_table(myIdx).day21, rep_table(myIdx).day22, rep_table(myIdx).day23, rep_table(myIdx).day24, rep_table(myIdx).day25,
                                      rep_table(myIdx).day26, rep_table(myIdx).day27, rep_table(myIdx).day28, rep_table(myIdx).day29, rep_table(myIdx).day30,
                                      rep_table(myIdx).day31;
       
       IF cur%NOTFOUND THEN  -- here comes ORA-06512 in a stack 
            dbms_output.put_line('ERROR' || nIndex);
       END IF;
       CLOSE cur;  
END MY_READ;

当我在 REP_HELPER1 中执行 FETCH 并关闭时,我没有收到错误消息。

【问题讨论】:

  • 您确定,您的光标总是恰好返回一条记录吗?你从哪里得到ORA-01001
  • @WernfriedDomscheit 无论如何,FETCH 只会返回一条记录?
  • 也许见stackoverflow.com/questions/11341166/… 反正你的整体设计对我来说有点奇怪,你可以回顾一下。
  • 游标已经在将被访问的最高级别初始化为非空。它不能解决问题。
  • 你能把你的代码变成一个小的、可重现的例子吗?很难根据代码片段进行调查。

标签: oracle plsql database-cursor


【解决方案1】:

这个简单的例子看起来和你的一样,而且效果很好:

declare
   mycur sys_refcursor;
   procedure my_read (cur sys_refcursor) is
      job long;
      sal number;
   begin
      fetch cur into job, sal;
      dbms_output.put_Line(job||' '||sal);
      close cur;
   end;
begin
   open mycur for select job, sal from emp where ename = 'KING';
   my_read (mycur);
end;  

所以我认为这不是问题。

根据https://www.techonthenet.com/oracle/errors/ora01001.php

您试图引用一个尚不存在的游标。这可能有 发生的原因:

  • 您在 OPENING 游标之前执行了 FETCH 游标。
  • 您在 OPENING 光标之前执行了 CLOSE 光标。
  • 您在 CLOSING 游标后执行了 FETCH 游标。

【讨论】:

  • 它确实与将 sys_refcursor 传递给另一个过程有关。由于没有发生任何描述的情况。我可以在程序REP_HELPER1 中获取并关闭。
猜你喜欢
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多