2017-11-26 21 views
0

私は簡単に解決できると思った小さな問題がありますが、わかりません。私は、クエリ、次のしている :私はここに達成したいことは、変数v_start_of_invoiceに与えることですPL/SQL条件付き選択を実装する方法

SELECT custom_field 
     INTO v_start_of_invoice 
     FROM BILL 
    WHERE BIMA_TRACKING_ID = v_previous_BIMAtrackingID 
     AND BSCO_CODE_ID = 'PRPAYMENT' 
     AND PREP_SEQ_NUM = 0 
     AND ITEM_CAT_CODE_ID = 1 
     AND PARTITION_KEY = v_prev_partition 
     AND SUBPARTITION_KEY = v_prev_subpartition; 

値「0」であれば1またはすべての条件が満たされていません。 単純な言葉で私はスクリプトが失敗しないようにしたいが、どこの条件が合っていれば何らかの値で変数を設定したい。さもなければ、値0を割り当てたい。 いくつかの方法がありますが、私はそれを達成するための最良の方法が何であるかを確認する必要があります。事前 M.

答えて

0

で 多くThksあなたは例外ブロックが実際に何をするかの誤解があるようです。まず、例外を回避することはできません。 "select into"を使用すると、正確に1行が返された場合にのみクエリが成功します。そうでなければ、PLSQLはクエリが0行を返すときにNO_DATA_FOUNDを内部的に発生させ、1行以上を返すときにはTOO_MANY_ROWSを内部的に発生させます。例外ブロックは、エラーが発生したときの処理をPLSQLに指示します。基本的に、例外ブロックは、特定のエラーを処理するアクションと、エラー処理を続行するか、エラーを破棄するかを指示します。 RAISEおよびRAISE_APPLICATION_ERRORステートメントを確認してください。

ブロックはネストすることができます。これを念頭に置いて、外部ブロックの文脈では、@areが提供するソリューションはまさにあなたが望むものです。構造は次のようになる限り

Begin 
    . 
    . 
    . 
    begin 
     place @are's code here. 
    end ; 

-- Continue your code here: The Error has been handled and execution continues as though the exception never happened. 
. 
. 
. 
end; 

"NVL(v_start_of_invoice、0);" v_start_of_invoiceがNULLの場合は0を返し、それ以外の場合はv_start_of_invoiceを返す関数です。 INTO変数の値は、例外ブロックで設定しないかぎり、SELECTがエラーを生成しないことに注意してください。

+0

私は完全にそれを得ました。一般に、ネストされたBEGIN END;私の問題を解決しています。私は複数の機能を持つパッケージを持っており、私は1つのpl/sqlスクリプトで全機能をテストしようとしています。すべての関数に対して1つの例外があることが判明しましたが、それをネストして1つのスクリプト内で複数の例外を使用できるかどうかはわかりませんでした。最後の疑問(あなたが書いている間に何か言葉を失ったと思います):返された行がなくなると、 "RETURN NVL(v_start_of_invoice、0)"ステートメントは変数に "0"を割り当てないので、例外コードは含まれていませんでした。私は正しい? –

0
begin 
SELECT custom_field 
     INTO v_start_of_invoice 
     FROM BILL 
    WHERE BIMA_TRACKING_ID = v_previous_BIMAtrackingID 
     AND BSCO_CODE_ID = 'PRPAYMENT' 
     AND PREP_SEQ_NUM = 0 
     AND ITEM_CAT_CODE_ID = 1 
     AND PARTITION_KEY = v_prev_partition 
     AND SUBPARTITION_KEY = v_prev_subpartition; 
exception WHEN NO_DATA_FOUND THEN 
    v_start_of_invoice := 0; 
end; 
+0

助けてくれることはありますが、この特定のケースの例外、他のヒントは避けたいですか? –

+0

私はまた、このコードは機能の一部であり、その後は次のようになっていることがわかります:RETURN NVL(v_start_of_invoice、0);私はreturn文が結果が0であるかどうかに関係なく、行が見つからなかったかどうか、または行が見つかった場合にだけ値を返すかどうかはわかりません。 –

+0

#1 'begin ... exception ... end'ブロックはあなたの関数の中にある必要があります。どのくらい複雑な機能がわからない – are