有没有办法在进行游标提取时判断哪条记录导致错误?例如,假设我有一个包含一列(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'之前,它会没有问题吗?这是我正在尝试调试的一个真正问题的一个简单示例。在实际示例中,它输出异常消息,而不是其他任何内容。这是否意味着它是导致问题的第一个记录,或者它不能以这种方式工作?
答案 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;
/