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

时间:2011-07-13 19:24:47

标签: 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;

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

1 个答案:

答案 0 :(得分: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;
/