[Oracle] プロシージャの引数の桁数は呼び出し側で決まる | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

Oracleのプロシージャやファンクションで引数を宣言する場合、データ型のみを指定し、桁数や精度は指定しません。

しかしだからといって、桁数や精度を意識せずに使っていると、以下のようなエラーが発生することがあります。

ORA-06502: PL/SQL: 数値または値のエラー: 文字列バッファが小さすぎます。が発生しました
プロシージャやファンクションの引数の桁数や精度は、最大で取られるわけではなく、呼び出し側の定義を継承しています。

したがって、以下のようなプロシージャを

CREATE OR REPLACE PROCEDURE PROC1 (
    p1 OUT VARCHAR2
)
IS
BEGIN
    p1 := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    p1 := 'ABC';
END;
/

以下のようなPL/SQLブロックから呼び出すと、

DECLARE
    wk_value VARCHAR2(10);
BEGIN
	PROC1( wk_value );
END;
/

最初の代入文でORA-06502エラーが発生します。

大抵の場合、プロシージャやファンクションの引数の桁数や精度をさほど意識しなくても、無意識のうちにオーバーフローを起こさないような使い方をしていると思われますが、ごくまれにこういうエラーでハマってしまうことがあります。

特に呼び出しのネストが深いと気づきにくいので要注意です。