2016-11-14 1 views
-1

こんにちは誰も私の質問に関するいくつかの概念的な知識を教えていただけますか? 私たちは、どのようなシナリオを使用するのですか?oracleでPROCEDUREのキーワード「RETURN」を使用しています ありがとう私たちはどのようなシナリオを使用しますか?oracleのPROCEDUREでキーワード「RETURN」を使用します

+2

[呼び出し側に制御を戻す](https://docs.oracle.com/cloud/latest/db112/LNPLS/subprograms.htm#CIHIIJEE)?私はあなたの質問を理解しているか分からない。正確に何を混乱させているのか? –

答えて

2

ほとんどの場合、プロシージャを早期に終了したいとき。これがいい考えかどうかは議論の余地があります。あなたのすべての方法で単一の入口と出口を好むための良い議論があります。しかし、時々、IFステートメントをネストするのではなく、何らかの状態を維持しようとするのではなく、複数の出口ポイントを持つコードを構築することが合理的です。

たとえば、属性を検証するために、さまざまなビジネスルールを適用する必要があるとします。呼び出し元は、フラグが返されたことを確認し、妥当性検査が失敗した場合はメッセージを返します。私はそれらの規則の1つが違反されるとすぐに戻ってそれを構造化するかもしれません。もちろん

CREATE OR REPLACE PROCEDURE validate_name(p_name   IN varchar2, 
              p_success_flag OUT boolean, 
              p_error_msg OUT varchar2) 
AS 
    l_cnt_disallowed pls_integer; 
BEGIN 
    IF(p_name IS NULL) 
    THEN 
    p_success_flag := false; 
    p_error_msg := 'The name must be non-NULL'; 
    return; 
    END IF; 

    IF(length(p_name) > 50) 
    THEN 
    p_success_flag := false; 
    p_error_msg := 'The name must be <= 50 characters.'; 
    return; 
    END IF; 

    SELECT COUNT(*) 
    INTO l_cnt_disallowed 
    FROM disallowed_names 
    WHERE name = p_name; 
    IF(l_cnt_disallowed > 0) 
    THEN 
    p_success_flag := 0false 
    p_error_msg := 'The name must not be in the disallowed list.'; 
    return; 
    END IF;  

    p_success_flag := true; 
end; 

のようなものは、あなたは、単一の出口点とIF/ ELSIF/ ELSIF/ ELSE(またはCASE)としてこれを実装することができます。それは確かに機能しますが、IFステートメントの前にすべての計算(select count(*)のような)をしなければならない可能性があります。そのため、特定のビジネスルールのロジックが2つの異なる場所にあるため、コードを読みにくくする可能性があります。そのため、各ビジネスルールの完全なロジックを理解することは難しくなります。あなたはロジックが一緒に残るように計算を入れたいかもしれませんが、かなり深く入れ子になったIFステートメントを使って、ルールがスキップされないようにすることができます。

あなたはまた、ルールに違反されたときtrueに設定されますフラグ(即ちl_found_error boolean := false)を追加することができ、その後のIF文はそれをチェックすることができ、そしてこの方法のための単一の出口点が存在するであろう。それは全く合理的なアプローチです。それはあなたが精神的に追跡する必要があるもう一つの状態変数を追加し、変数がtrueに設定された後に変数をリセットするようなことを誰も愚かなことをしなかったことを少なくとも素早く検証します。個人的には、この種の場合には、returnから、後続のコードが実行されないことを見ることができるという利点は、単一のリターンを有することの価値をわずかに上回るが、それは主観的意見である。

この特定のケースでは、2つのフィールドを持つオブジェクトを返す関数、またはエラーコードを返す代わりにルールに違反したときに例外をスローするプロシージャを持っていますが、カスタムエラーメッセージを見つけて解析しますエラースタックとそれをユーザに提示することは、単にOUTパラメータを使用するよりもかなり複雑になる可能性があります。

関連する問題