【问题标题】:How can I tell which record causes the error while doing a cursor fetch?在进行游标提取时,如何判断哪个记录导致错误?
【发布时间】:2011-07-13 19:24:47
【问题描述】:

在进行游标提取时,有什么方法可以判断是哪条记录导致了错误?例如,假设我有一个表,其中有一列 (varchar2),“值”,具有以下值:

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”之前,它会毫无问题地输出吗?这是我正在尝试调试的实际问题的一个简单示例。在实际示例中,它只输出异常消息,仅此而已。这是否意味着它是导致问题的第一条记录,或者它只是不能以这种方式工作?

【问题讨论】:

    标签: sql oracle plsql oracle11g


    【解决方案1】:

    它应该输出值直到遇到异常的行,至少根据我对您的程序的测试。也就是说,除非您在查询中执行 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;
    /
    

    【讨论】:

    • 另请注意,如果错误出现在 where 子句中(例如 WHERE TO_NUMBER(value) > 0),那么在获取任何数据之前您也会收到错误。
    • 谢谢你们俩!这解释了为什么在我测试时生产代码不显示任何内容。在 where 子句中有一个 AND 失败的 to_number 函数的顺序。
    猜你喜欢
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 2010-12-24
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多