0

関数のパラメータ サイズに応じて、Oracle パッケージで Varchar2 型のグローバル変数のサイズを設定する方法。

CREATE OR REPLACE PACKAGE Test 
AS

   g_lastname Varchar2(15);
   FUNCTION search( p_lastname IN varchar2);

END;

CREATE OR REPLACE PACKAGE BODY Test
AS
    FUNCTION search(p_lastname IN VARCHAR2) return VARCHAR2 
    IS
    BEGIN
        g_lastname := p_lastname;
        return g_lastname;
    END;
END;

ここでの問題は、p_lastname のサイズが 15 を超えるとエラーが発生することです。

4

2 に答える 2

1

関数パラメータは の任意のサイズにすることができ、varchar2それは実行時までわからないため、できません。

値が後でどのように使用されるかがわかっている場合は、テーブルの列に基づいて値を制限できる場合があります。したがって、最終的に select from table で使用される場合は、次のpeopleように宣言できます。

    g_lastname people.last_name%type;

関数宣言でその構文を使用することもできます。

    FUNCTION search(p_lastname IN people.last_name%type) return VARCHAR2

...ただし、実際には渡すことができる値のサイズを制限していません。の値p_lastnameが大きすぎると、割り当ては失敗します。おそらく、このシナリオのある時点で失敗する必要があり、後でselect. ただし、コードにある程度の一貫性があり、(IMO) グローバルとパラメーターの意図が示されます。これは、後でメンテナンスとトラブルシューティングに役立ちます。

エラーを回避したいだけの場合は、渡された値が長すぎる場合に切り捨てるオプションがあります。

        g_lastname := substr(p_lastname, 1, 15);

... または最初に長さをテストしますが、マジック ナンバーは正確には理想的ではありません ( の定義を変更する場合g_lastnameは、その長さに依存するものを見つけて置き換えることを忘れないでください)。または例外をキャッチして何かをします。

それ以外の場合は、最大で、考えられるよりも大きく宣言するだけで大​​きなマイナス面はありません。

    g_lastname varchar2(32767);

おそらく、現実的なより小さな最大長を考え出すことができますが、値が必要になることはありません (もちろん、誰かが要件を変更するまでは!)。ドキュメントでは、大きな変数のメモリ割り当てについて説明しています。

于 2013-04-12T10:20:35.453 に答える