如何在进行游标提取时判断哪条记录导致错误?

Mat*_*t M 3 sql oracle plsql oracle11g

有没有办法在进行游标提取时判断哪条记录导致错误?例如,假设我有一个包含一列(varchar2)的表,"value",其中包含以下值:

1,2,3,4,g,5,6

我做以下事情:

DECLARE
    answer number;
    CURSOR c1 IS
    SELECT to_number(value) FROM table;
BEGIN
   OPEN c1;  
   LOOP
      FETCH c1 INTO answer;
      EXIT WHEN c1%NOTFOUND;
      DBMS_OUTPUT.PUT_LINE(answer);
   END LOOP;
   CLOSE c1;
 EXCEPTION WHEN invalid_number THEN    
    dbms_output.put_line('an invalid number exception was encountered');
END;
Run Code Online (Sandbox Code Playgroud)

在遇到'g'之前,它会没有问题吗?这是我正在尝试调试的真正问题的一个简单示例.在实际示例中,它输出异常消息,而不是其他任何内容.这是否意味着它是第一个导致问题的记录,或者它不能以这种方式工作?

DCo*_*kie 6

它应该输出值,直到遇到有异常的行,至少根据我对你的程序的测试.也就是说,除非您在查询中执行ORDER BY,否则在获取任何行之前您可能会看到异常.

您可以自己查看在没有选择中的TO_NUMBER函数的情况下尝试获取的内容.这样的事情可能会有所帮助:

DECLARE
    answer number;
    temp   VARCHAR2(10);
    CURSOR c1 IS
    SELECT ID FROM table;
BEGIN
   OPEN c1;
   LOOP
      FETCH c1 INTO temp;
      EXIT WHEN c1%NOTFOUND;
      DBMS_OUTPUT.PUT(temp||': Converted is: ');
      dbms_output.put_line(to_number(temp));
   END LOOP;
   CLOSE c1;
 EXCEPTION WHEN invalid_number THEN    
    dbms_output.put_line('an invalid number exception was encountered');
           WHEN OTHERS THEN
    dbms_output.put_line('Some other error');
END;
/
Run Code Online (Sandbox Code Playgroud)

  • 另请注意,如果错误在where子句中(例如`WHERE TO_NUMBER(value)> 0`),那么在获取任何数据之前,您也会收到错误. (2认同)