2008-11-14 29 views
1

我想使用Oracle異常來處理下面代碼中可能發生的錯誤。如果用戶提供數據庫中不存在的書籍ID和/或員工ID,則會引發NO_DATA_FOUND異常。因此,我怎麼知道哪個語句引發了這個異常。使用Oracle異常

CREATE OR REPLACE PROCEDURE TEST_EXCEPTION 
(
    book_id_in IN book.book_id%TYPE, 
    emp_id_in IN emp.emp_id%TYPE 
) 
IS 

v_book_desc book.description%TYPE; 
v_emp_name emp.emp_name%TYPE; 

BEGIN 

SELECT description into v_book_desc FROM book WHERE book_id = book_id_in; 

... 

SELECT emp_name into v_emp_name FROM emp WHERE emp_id = emp_id_in; 

... 

EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     /* Do something */ 


END TEST_EXCEPTION; 

我欣賞任何建議或指導。謝謝。

回答

0

您可以在給定語句前設置一個變量。喜歡;

CREATE OR REPLACE PROCEDURE TEST_EXCEPTION (book_id_in IN book.book_id%TYPE, emp_id_in IN emp.emp_id%TYPE) IS 

v_book_desc book.description%TYPE; v_emp_name emp.emp_name%TYPE; 
statementIndex number(1, 0); 

BEGIN 

statementIndex := 1; 
SELECT description into v_book_desc FROM book WHERE book_id = book_id_in; 

... 

statementIndex := 2; 
SELECT emp_name into v_emp_name FROM emp WHERE emp_id = emp_id_in; 

... 

EXCEPTION WHEN NO_DATA_FOUND THEN 
if statementIndex = 1 
then 
/* Do something */ 
else 
/* Do something */ 
endif; 

END TEST_EXCEPTION; 
4

存在其中這是可以做到的各種方式:

OPTION 1

另一個選擇是創建多個開始/結束塊

CREATE OR REPLACE PROCEDURE TEST_EXCEPTION (
    book_id_in IN book.book_id%TYPE, 
    emp_id_in IN emp.emp_id%TYPE) 
IS 

v_book_desc book.description%TYPE; v_emp_name emp.emp_name%TYPE; 
statementIndex number(1, 0); 

BEGIN 

    BEGIN 

    SELECT description into v_book_desc FROM book WHERE book_id = book_id_in; 

    EXCEPTION WHEN NO_DATA_FOUND THEN 
     -- do your handling or raise a custom exception to be handled at end 
    END; 

    BEGIN 

    SELECT emp_name into v_emp_name FROM emp WHERE emp_id = emp_id_in; 

     EXCEPTION WHEN NO_DATA_FOUND THEN 
     -- do your handling or raise a custom exception to be handled at end 
    END; 

EXCEPTION WHEN_OTHERS THEN 

END TEST_EXCEPTION; 

OPTION 2

另一種選擇是使用遊標;

使用光標%NOTFOUND

見(http://www.unix.com.ua/orelly/oracle/langpkt/ch01_09.htm)瞭解有關遊標


OPTION 3:從Yapiskan

CREATE OR REPLACE PROCEDURE TEST_EXCEPTION (book_id_in IN book.book_id%TYPE, emp_id_in IN emp.emp_id%TYPE) IS 

v_book_desc book.description%TYPE; v_emp_name emp.emp_name%TYPE; 
statementIndex number(1, 0); 

BEGIN 

statementIndex := 1; 
SELECT description into v_book_desc FROM book WHERE book_id = book_id_in; 

... 

statementIndex := 2; 
SELECT emp_name into v_emp_name FROM emp WHERE emp_id = emp_id_in; 

... 

EXCEPTION WHEN NO_DATA_FOUND THEN 
if statementIndex = 1 
then 
/* Do something */ 
else 
/* Do something */ 
endif; 

END TEST_EXCEPTION; 
複製