【发布时间】:2026-02-22 05:45:01
【问题描述】:
在第二次运行过程期间,我不断收到 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。
标签: oracle plsql oracle-sqldeveloper