2009-05-19 6 views
3

次のように私は、PL/SQLストアド・プロシージャがあるとします。今PL/SQLパラメータの値がデフォルトに設定されているかどうかを確認する方法を教えてください。

PROCEDURE do_something(foo VARCHAR2 DEFAULT NULL) IS 
BEGIN 
    /* Do something */ 
END; 

do_somethingは、2つの異なる方法が呼び出されたとします

/* Scenario 1: The 'foo' parameter defaults to NULL */ 
do_something(); 

/* Scenario 2: The 'foo' parameter is explicitly set to NULL */ 
do_something(foo => NULL) 

私はあるシナリオを決定するためにdo_something手順を定義することができますどのようにそれを呼びますか?

編集:この手順のために私の意図を明確化:

以下
FUNCTION find_customer(name VARCHAR2 DEFAULT NULL, number VARCHAR2 DEFAULT NULL) RETURN NUMBER IS 
BEGIN 
    /* Query the "customer" table using only those parameters provided */ 
END; 

は例が関連するSQL句で、この手順で使用している希望:

/* SELECT * FROM customer WHERE customer.name = 'Sam' */ 
find_customer(name => 'Sam') 

/* SELECT * FROM customer WHERE customer.name = 'Sam' AND customer.number = '1588Z' */ 
find_customer(name => 'Sam', number => '1588Z') 

/* SELECT * FROM customer WHERE customer.name = 'Sam' AND customer.number IS NULL */ 
find_customer(name => 'Sam', number => NULL) 

/* SELECT * FROM customer WHERE customer.name IS NULL */ 
find_customer(name => NULL) 

/* SELECT * FROM customer WHERE customer.name IS NULL AND customer.number IS NULL */ 
find_customer(name => NULL, number => NULL) 
+0

なぜシナリオを区別したいのですか?結局、fooは同じ価値を持つことになるのではないでしょうか? – Petros

+0

ペトロス、私の最新の編集が、私がこれをやっている理由を明確にするのに役立ちます。 –

+0

あなたが実際にしているのは、第2の種類の「NULL」です。 "UNCONSTRAINED"または "UNSPECIFIED" - あなたはデフォルトとして魔法の値を使うことができますが、私の好みは実際には明示的にラッパープロシージャーを作成することです - たくさんある場合、それらを生成するスクリプトを書くことができます。 –

答えて

7

あなたは代わりに使用しての手順をオーバーロードすることができデフォルト値:

PROCEDURE do_something(foo VARCHAR2) IS 
BEGIN 
    /* Do something */ 
END; 

PROCEDURE do_something IS 
BEGIN 
    /* here you know: no argument. Then call do_something(null) */ 
END; 
+0

+1非常にクリアで効果的!残念ながら、私は自分自身を完全にはっきりさせませんでした。私はいくつかのパラメータを持つ手続きを書いており、その多くはデフォルトにすることができます。オーバーロードすると、むしろ避けたい多くの順列が必要になります。しかし、私が尋ねた質問にあなたが完全に答えたことを考えれば、あなたは受け入れられた答えに値すると思います。 –

+1

多くの手順について気にする必要はありません。私はPL/SQLで何年も働いていないので、あなたが非公開にするかどうか忘れてしまいました。可能であれば、それはまったく問題にはなりません。コードが重複していないことを確認してください。他のプロシージャから1つのプロシージャをコールします。あなたは論理を含み、 "public"手続きから呼び出される追加の引数を持つ第3の(プライベート?)手続きを書くことができます。 –

+1

プライベート手続き自体はできませんが、パッケージ内にプライベート手続きを持つことができます。 –

8

defaultinではなくgをnullに設定すると、省略されたパラメータ値は、実際の世界では決して使用しないものにデフォルト設定されますか?使用する値はあるドメインに属している必要があり、そのドメイン外の値を選択する必要があります。

例えば

PROCEDUREのdo_something(FOO VARCHAR2のDEFAULT '*#@')が

l_foo VARCHAR2(32000); -- local copy of foo parm 

IF foo = '*#@' THEN 

-- I know the parm was omitted 

    l_foo := NULL; 

ELSE 

    l_foo := foo; 

END IF; 

ENDをBEGINされます。

+1

これも私の考えでした。真のデフォルト値は手続き本体で実装できます。 –

+2

同上ですが、実際は印刷できない文字を使用しています。一般的にchr(7)[ビープ音のASCIIコードです]。 –

+0

同上!私はこのオプションも好きです。特に、印刷できない文字についてのGaryのコメントです。 –

関連する問題