Oracle数据库是目前使用最广泛的数据库之一,对于数据库的操作过程中,经常会遇到各种错误,其中一个比较常见的错误就是-01403异常。-01403异常主要出现在编写PL/SQL语句的过程中,当SQL语句未能查找到返回结果时,会抛出这个异常。
-01403异常通常的错误信息如下:
ORA-01403: no data found
这个错误信息是非常具有误导性的,直接提示没有查询到数据,但是实际上不一定就是查询不到数据造成的异常,还有可能查询结果集为空造成的异常。
下面通过一个查询的例子来说明:
DECLARE v_var NUMBER; BEGIN SELECT COUNT(*) INTO v_var FROM TABLE_NAME WHERE COLUMN_NAME LIKE '%SOMETHING%'; IF (v_var = 0) THEN NULL; ELSE RAISE_APPLICATION_ERROR(-20999, 'Found records.'); END IF; END;
这个语句是检查某张表是否包含了字符' SOMETHING'。假如表中确实不存在这样的记录,则会正常执行,程序正常结束。但是假如表中存在这样的记录,则会抛出ORA-01403异常,此时错误信息与实际情况不相符。
为了避免这个问题,我们需要在SELECT语句前面加上一个 E XCEPT选项:
SELECT COUNT(*) INTO v_var FROM TABLE_NAME WHERE COLUMN_NAME LIKE '%SOMETHING%' AND ROWNUM = 1;
增加这个选项后,如果查询返回的结果集为空,则会自动抛出ORA-01403异常。
还有一种情况是,在使用游标时,需要在WHILE循环内检查是否存在结果,否则会抛出ORA-01403异常:
DECLARE CURSOR name_cursor IS SELECT COLUMN_NAME FROM TABLE_NAME WHERE SOME_FILTER_CONDITION; name_var name_cursor%ROWTYPE; -- or RECORD for anonymous block BEGIN OPEN name_cursor; LOOP FETCH name_cursor INTO name_var; EXIT WHEN name_cursor%NOTFOUND; -- process fetched record END LOOP; CLOSE name_cursor; END;
在上面的代码块中,如果不检查结果集的情况下,当FETCH语句返回空结果时,会抛出ORA-01403异常。
综上所述,ORA-01403异常通常出现在PL/SQL语句中,在查询结果为空时会抛出该异常。处理该异常可以使用EXCEPT选项来判断结果是否为空,也可以在使用游标时在WHILE循环中判断结果是否存在。