ORA-06502: PL/SQL: 在空游标的情况下出现数字或值错误

Posted

技术标签:

【中文标题】ORA-06502: PL/SQL: 在空游标的情况下出现数字或值错误【英文标题】:ORA-06502: PL/SQL: numeric or value error in the case of empty cursor 【发布时间】:2020-11-22 07:15:52 【问题描述】:

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

在第二次执行后打印带有日志的行->读取/插入: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);

【问题讨论】:

构造 'SQLCODE: '||SQLCODE||' -- ERROR: '||SQLERRM 是一个旧的反模式。它所做的只是将系统生成的消息(例如ORA-06501: PL/SQL: program error)转换为SQLCODE: -6501 -- ERROR: ORA-06501: PL/SQL: program error。显然,这不是对原始消息的改进。我建议坚持使用普通的sqlerrmdbms_application_info.format_error_stack 【参考方案1】:

使用这个:

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 异常,因此您可以跳过该异常处理程序。

【讨论】:

以上是关于ORA-06502: PL/SQL: 在空游标的情况下出现数字或值错误的主要内容,如果未能解决你的问题,请参考以下文章

oracle ORA-06502:PL/SQL:数字或值错误:批量绑定:截断绑定

ORA 06502 错误 PL/SQL

PL/SQL: 数字或值错误 - ORA-06502

出现错误 ORA-06502: PL/SQL: numeric or value error

ORA-06502 PL/SQL:数字或值错误:字符到数字的转换错误;

ORA-06502: PL/SQL: 数字或值错误: NULL 索引表键值