2008-11-14 9 views
1

Je souhaite utiliser l'exception Oracle pour gérer les erreurs pouvant survenir dans le code ci-dessous. Si un utilisateur fournit l'ID de livre et/ou l'ID employé qui n'existe pas dans la base de données, l'exception NO_DATA_FOUND sera déclenchée. Ainsi, comment puis-je savoir quelle instruction soulève cette exception.Utiliser Oracle Exception

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; 

J'apprécie toute suggestion ou conseil. Je vous remercie.

Répondre

0

Vous pouvez définir une variable avant les instructions données. Comme;

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

Il existe différentes façons dont cela peut être fait:

OPTION 1

L'autre option est de créer plusieurs begin/blocs d'extrémité

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

L'autre option consiste à utiliser les curseurs;

L'utilisation curseur% NOTFOUND

Voir (http://www.unix.com.ua/orelly/oracle/langpkt/ch01_09.htm) pour comprendre sur les curseurs


OPTION 3: Copié de 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;