ORA-01002: 提取乱序

Posted

技术标签:

【中文标题】ORA-01002: 提取乱序【英文标题】:ORA-01002: fetch out of sequence 【发布时间】:2017-03-11 04:01:54 【问题描述】:

我在 oracle 数据库中创建了一个过程,该过程在引用游标中返回数据,并且我希望它也将这个游标的行数作为输出变量返回。经过测试,正确填充了 P_count 变量,但是当我尝试打开游标时,触发了“ORA-01002: fetch out of sequence”错误。我以前读过它,我发现问题是因为我在我的代码中使用了 fetch 语句。但是直到现在我还没有发现如何解决它。任何帮助表示赞赏,谢谢。以下是我的程序:

PROCEDURE IS_CLIENT_LOGGED_IN (
  P_CLIENT_NUM  Varchar2,
  P_CURSOR out  SYS_REFCURSOR ,
  P_COUNT OUT   NUMBER,
  P_ERROR out   Varchar2
) AS
  cur_rec Varchar2(1024);
BEGIN
   BEGIN 
     Open P_CURSOR FOR
       SELECT ID
         FROM tbl_registration
        WHERE tbl_client_id = P_CLIENT_NUM  
          AND tbl_logout_date is null;

     LOOP
      FETCH P_CURSOR INTO cur_rec;  
      EXIT WHEN P_CURSOR%notfound;
      P_COUNT := P_CURSOR%rowcount;--will return row number beginning with 1
     END LOOP;
   EXCEPTION WHEN OTHERS THEN 
     P_ERROR := 'Unable to select Data from tbl_registration' ||SQLERRM;
   END;    
END IS_CLIENT_LOGGED_IN;

【问题讨论】:

游标使用完毕后应关闭。 您的程序的目的是什么?通常,当您返回 SYS_REFCURSOR 时,调用块会获取记录。你不应该在已经获取行的地方返回游标。 这个过程是在另一个过程中实现的:所以我需要一个行数来返回一个计数器以便在另一个过程中循环,并且需要一个游标来处理检索到的数据也在另一个过程中。当我在 LOOP 之前添加 CLOSE P_CURSOR 时,在循环时无法定义游标,但是当我在 END LOOP 之后添加时,它返回 ORA-24338 语句句柄未执行。谢谢@WernfriedDomscheit 【参考方案1】:

根据您的评论,程序应该是这样的:

PROCEDURE IS_CLIENT_LOGGED_IN (
  P_CLIENT_NUM  Varchar2,
  P_CURSOR out  SYS_REFCURSOR ,
  P_COUNT OUT   NUMBER,
  P_ERROR out   Varchar2
) AS
  cur_rec Varchar2(1024);
BEGIN
     Open P_CURSOR FOR
       SELECT ID
         FROM tbl_registration
        WHERE tbl_client_id = P_CLIENT_NUM  
          AND tbl_logout_date is null;

     LOOP
      FETCH P_CURSOR INTO cur_rec;  
      EXIT WHEN P_CURSOR%notfound;
      P_COUNT := P_CURSOR%rowcount;--will return row number beginning with 1
     END LOOP;
     CLOSE P_CURSOR;

     Open P_CURSOR FOR
       SELECT ID
         FROM tbl_registration
        WHERE tbl_client_id = P_CLIENT_NUM  
          AND tbl_logout_date is null;

   EXCEPTION WHEN OTHERS THEN 
     P_ERROR := 'Unable to select Data from tbl_registration' ||SQLERRM;
END IS_CLIENT_LOGGED_IN;

效率不高,但这正是您所要求的。 无论如何,我看不出有任何理由逐个增加P_COUNT

制作

SELECT COUNT(*) INTO P_COUNT
     FROM tbl_registration
    WHERE tbl_client_id = P_CLIENT_NUM  
      AND tbl_logout_date is null;

Open P_CURSOR FOR
   SELECT ID
     FROM tbl_registration
    WHERE tbl_client_id = P_CLIENT_NUM  
      AND tbl_logout_date is null;

得到同样的结果。

【讨论】:

实际上我试图避免两个选择并通过计算光标行从一个选择中获得结果,无论如何感谢@Wernfried Domscheit

以上是关于ORA-01002: 提取乱序的主要内容,如果未能解决你的问题,请参考以下文章

ORA-01002: 提取乱序

ListAgg() ORA-01002: 提取乱序

提取序列 <ora-01002> 回滚

ORA-01002: 提取过程中的顺序不正确

pl/sql 存储函数 ora-01002 无序获取 SIMPLE

scrapy爬下来的数据是乱序的,如何排序?