2009-08-06 6 views
2

表から1つの値を選択するPL/SQL関数があるとします。クエリでレコードが返されない場合は、が呼び出されたときに、より意味のあるエラーメッセージが表示されるように、NO_DATA_FOUNDエラーを伝播して(呼び出しコードで捕捉できるように)したいと考えています。ここでPL/SQLでエラーが発生したときに、より意味のあるメッセージを提供

は私が達成しようとしているものの例である:

FUNCTION fetch_customer_id(customer_name VARCHAR2) RETURN NUMBER; 
    customer_id NUMBER; 
BEGIN 
    SELECT customer_id 
     INTO customer_id 
     FROM CUSTOMERS 
    WHERE customer_name = fetch_customer_id.customer_name; 

    RETURN customer_id; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     meaningful_error_message := 'Customer named ' || customer_name || ' does not exist'; 
     RAISE; 
END; 

NO_DATA_FOUNDエラーでmeaningful_error_messageを関連付ける方法はありますか?

更新:NO_DATA_FOUNDが検出されたとき、私はカスタムエラーコードを高めるためにRAISE_APPLICATION_ERRORを使用することが示唆されています。この質問の目的は、呼び出しコードがカスタムエラーコードではなくエラーNO_DATA_FOUNDをキャッチできるように、この手法を回避できるかどうかを判断することでした。キャッチNO_DATA_FOUNDは、より意味的に正しいようですが、私は間違っている可能性があります。

答えて

7

使用RAISE_APPLICATION_ERROR (-20001, 'your message');

これは、代わりにNO_DATA_FOUNDメッセージのエラー番号-20001、そしてあなたのメッセージを返します。オラクル社では、アプリケーションでユーザーが使用するために、-20001〜-210000のエラー番号を予約しているため、これらの番号を使用して別のOracleエラーを隠すことはありません。

編集:RAISE_APPLICATION_ERRORは、独自のエラーメッセージを作成できるように特別に設計されています。したがって、Oracleには動的エラー・メッセージを許可する別の方法はありません。これをさらに洗練するために、プロシージャを定義するパッケージで独自の例外を定義することができます。以下を追加します。

CUSTOMER_NO_DATA_FOUND EXCEPTION; 
EXCEPTION_INIT (CUSTOMER_NO_DATA_FOUND, -20001); 

をあなたのプロシージャのコードでは、RAISE_APPLICATION_ERRORを行うには、クライアントコードは良く見える WHEN CUSTOMER_NO_DATA_FOUND THENを行うことができ、そしてそれらはまだSQLERRMで撮影したエラーメッセージを持っています。

+0

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/errors.htm#sthref2006 – Mac

+0

カスタムエラーコードではなく、私にとっては、それは意味的にはそれほど正しいと思われる。しかし、あなたの応答をありがとう! :) –

2

Thomasで提案されているように、RAISE_APPLICATION_ERRORを使用できます。あなたはまた、エラー・スタック上NO_DATA_FOUNDエラーを維持したい場合は、関数の3番目のパラメータとしてTRUE追加することができます。

DECLARE 
    l NUMBER; 
BEGIN 
    SELECT NULL INTO l FROM dual WHERE 1 = 2; 
EXCEPTION 
    WHEN no_data_found THEN 
     raise_application_error(-20001, 'Meaningful Message', TRUE); 
END; 

ORA-20001: Meaningful Message 
ORA-06512: at line 8 
ORA-01403: no data found (*) 

はラインがタグ付けされた(*)元のエラーメッセージです。私は、呼び出し元のコードは `NO_DATA_FOUND`エラーをキャッチすることができるように` RAISE_APPLICATION_ERROR`を避けるために期待していた

+0

チップのおかげで。私がトーマスのコメントで述べたように、私はRAISE_APPLICATION_ERRORを含まない解決策があるかどうかを見たいと思っていました。ありがとう、しかし! –

関連する問題