ORA-06502: PL/SQL: 游标为空时出现数字或值错误

ORA-06502: PL/SQL: numeric or value error in the case of empty cursor

我不断收到错误:ORA-06502:PL/SQL:在过程的第二个 运行 期间出现数字或值错误。 以下部分 运行 第一次正常工作。读取 150 000 条记录对其进行处理,操作.. 当我第二次 运行 时,my_cursor 是空的,因为在第一个 运行 中处理了所有 150 000 条记录。除了这里我会得到 NO_DATA_FOUND 但我不断收到 ERROR: ORA-06502: PL/SQL: numeric or value error.

第二次执行后用日志打印行-> read/inserted : 0。这也可以,因为没有数据要处理...

OPEN my_cursor;
LOOP
    FETCH my_cursor BULK COLLECT INTO var_t LIMIT 100000; 
    FOR i IN var_t.FIRST .. var_t.LAST  
    LOOP
    var_read_cnt := var_read_cnt + 1;
    END LOOP;
    EXIT WHEN my_cursor%NOTFOUND; 
END LOOP;
close my_cursor;
EXCEPTION
WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.put_line('OK no data found  SQLCODE: '||SQLCODE||' -- ERROR: '||SQLERRM);
WHEN OTHERS THEN  
    DBMS_OUTPUT.put_line(' Unexcpected exception SQLCODE: '||SQLCODE||' -- ERROR: '||SQLERRM);
END;
DBMS_OUTPUT.put_line('read/inserted : '|| var_read_cnt);

使用这个:

LOOP
    FETCH my_cursor BULK COLLECT INTO var_t LIMIT 100000; 
    IF var_t.FIRST IS NOT NULL THEN
       FOR i IN var_t.FIRST .. var_t.LAST  
       LOOP
          var_read_cnt := var_read_cnt + 1;
       END LOOP;
    END IF;
    EXIT WHEN my_cursor%NOTFOUND; 
END LOOP;

注意,OPEN cursor ... 结构永远不会引发 NO_DATA_FOUND 异常,因此您可以跳过该异常处理程序。