sql >> データベース >  >> RDS >> Oracle

Oracleストアドプロシージャの文字列バッファが小さすぎるエラー

    コメントで言及されているシナリオの簡単なデモ:

    create or replace procedure p42(out_message out varchar2) as
    begin
      out_message := 'Test message';
    end p42;
    /
    

    十分に大きいと宣言されている変数でそれを呼び出す場合、それは問題ありません。私は12文字の変数を持っているので、12文字の値を割り当てることは問題ではありません:

    declare
      msg varchar2(12);
    begin
      p42(msg);
    end;
    /
    
    anonymous block completed
    

    しかし、間違えて発信者の変数を小さくしすぎると、次のようなエラーが発生します。

    declare
      msg varchar2(10);
    begin
      p42(msg);
    end;
    /
    
    Error report:
    ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    ORA-06512: at "STACKOVERFLOW.P42", line 3
    ORA-06512: at line 4
    06502. 00000 -  "PL/SQL: numeric or value error%s"
    *Cause:    
    *Action:
    

    エラースタックには、エラーが発生したプロシージャの行(3行目)と、エラーが発生した呼び出し元の行(4行目)の両方が表示されます。もちろん、どこで呼んでいるかによっては、スタック全体がない場合もあります。

    将来的にはさまざまなエラーメッセージが表示されるとのことですが。これを呼び出すものが、メッセージを処理するのに十分な大きさの変数を定義していることを確認する必要があります。それらがテーブルに保存されている場合は、それを半自動化できます。そうでない場合は、手動のコードレビューチェックになります。

    OK、これを投稿した後、c#コメントを見ました。 このコンストラクター を呼び出しているようです。;デフォルトのサイズはわかりませんが、1であると考えるのは無理ではありません。したがって、このコンストラクター 代わりに、サイズを明示的に指定します:

    ...次のようなもの:

    OracleParameter prm15 = new OracleParameter("out_str_message",
        OracleDbType.Varchar2, 80);
    

    作成後にサイズをリセットする方法がない限り、私にはわかりません。 (私が今まで使ったことのないものです!)




    1. MySQLクエリSelect、SUM、LEFT JOIN

    2. 空のテーブルのMAX()をNULLではなく0として扱う方法

    3. liquibaseを使用してmysqlでトリガーを作成する

    4. Hibernate:インデックスを作成する