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語句中,在查詢結果為空時會拋出該異常。處理該異??梢允褂肊XCEPT選項來判斷結果是否為空,也可以在使用游標時在WHILE循環中判斷結果是否存在。
上一篇python的靜態和類
下一篇css圖像縮小2背