淘先锋技术网

首页 1 2 3 4 5 6 7

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循环中判断结果是否存在。