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
。显然,这不是对原始消息的改进。我建议坚持使用普通的sqlerrm
或dbms_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: numeric or value error