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

Posted

技术标签:

【中文标题】在进行游标提取时,如何判断哪个记录导致错误?【英文标题】: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”之前,它会毫无问题地输出吗?这是我正在尝试调试的实际问题的一个简单示例。在实际示例中,它只输出异常消息,仅此而已。这是否意味着它是导致问题的第一条记录,或者它只是不能以这种方式工作?

【问题讨论】:

【参考方案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 函数的顺序。

以上是关于在进行游标提取时,如何判断哪个记录导致错误?的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL练习显式游标

Discord.py:如何提取布尔值以判断某人是不是静音

有啥方法可以判断哪个状态更改导致在 SwiftUI 中重建视图?

如何判断苹果笔记本 适合哪个版本的bootcamp

如何判断哪个签名的 jar 导致 maven-shade-plugin 失败?

如何判断ARP欺骗?该怎么防护?