1

以下のコードで発生する可能性のあるエラーを処理するために、Oracle の例外を使用したいと考えています。ユーザーがデータベースに存在しない書籍 ID や従業員 ID を提供すると、NO_DATA_FOUND 例外が発生します。したがって、どのステートメントでこの例外が発生するかをどのように知ることができますか。

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;

提案やガイダンスに感謝します。ありがとうございました。

4

2 に答える 2

5

これを行うには、さまざまな方法があります。

オプション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;

オプション 2

もう 1 つのオプションは、カーソルを使用することです。

cursor%NOTFOUND の使用

カーソルについて理解するには、 ( http://www.unix.com.ua/orelly/oracle/langpkt/ch01_09.htm )を参照してください


オプション 3: ヤピスカンからコピー

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;
于 2008-11-14T09:25:03.443 に答える
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

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;
于 2008-11-14T08:52:37.923 に答える