2013-07-11 22 views
5

Oracle 11gストアドプロシージャでエラーが発生します。エラーは、それがライン31は、その行に何か問題があり、なぜ私は本当にわからないout_cnt_tot := 0;を含む行で起こっている...Oracleストアドプロシージャで文字列バッファが小さすぎます

ORA-06502: PL/SQL: numeric or value error: character string buffer too small

です。別のプログラマーがこのプロシージャーを作成しました。私はSQLプロシージャーに精通していません。誰も私がこれを理解するのを助けることができますか?

create or replace 
PROCEDURE     "FIP_BANKREC_PREP" 
        (
    in_file_date in varchar2, 
    in_bank_code in varchar2, 
    out_cnt_apx_miss_no out integer, 
    out_cnt_prx_miss_no out integer, 
    out_cnt_apx_no_mtch out integer, 
    out_cnt_prx_no_mtch out integer, 
    out_cnt_ap_dup out integer, 
    out_cnt_pr_dup out integer, 
    out_cnt_bad out integer, 
    out_cnt_ap_load out integer, 
    out_cnt_pr_load out integer, 
    out_cnt_ap_not_load out integer, 
    out_cnt_pr_not_load out integer, 
    out_cnt_tot out integer, 
    out_message out varchar2 
    ) as 

file_date date; 
ap_acct_no varchar2(16); 
pr_acct_no varchar2(16); 

-- ------------------------------------------------------ 
-- begin logic 
-- ------------------------------------------------------ 
begin 

    file_date := to_date(in_file_date,'yyyymmdd'); 
    out_cnt_tot := 0; --- THE ERROR IS ON THIS LINE --- 
    out_message := 'Test Message'; 

    select brec_acct_code into ap_acct_no 
    from MSSU.zwkfi_bankrec_accts 
    where brec_acct_bank = in_bank_code 
     and brec_acct_type = 'AP'; 

    select brec_acct_code into pr_acct_no 
    from MSSU.zwkfi_bankrec_accts 
    where brec_acct_bank = in_bank_code 
     and brec_acct_type = 'PR';  

// The rest of the procedure... 
+0

あなたはそれが31行目のことをどのように知っていますか?本気ですか? 16進エディタでファイルを見ようとしましたか?あなたのエディタでは見えないが、問題を引き起こすUTF-8文字を見つけることができるかもしれません。 –

+2

それは、その後の行になる可能性はかなり高くなります。これらのメッセージの行番号は、時にはあなたが期待するものではありません。これはおそらくプロシージャ自体のエラーではなく、小さすぎる 'out_message'としてプロシージャに渡す変数のサイズを意味します。あなたはこれをどのように呼んでいるのか、その呼び出しの変数がどのように宣言されているのかを示すことができますか? –

+0

out_messageに渡されるのは、 "Test Message"というリテラルだけです。私たちはすぐにメッセージを追加しようとしていますが、まだそれを知りませんでしたので、そこにいくつかのプレースホルダテキストを置いています。文字列 "Test Message"がその変数に対して短すぎる可能性はありますか?私はこれまでに起こったことは聞いたことがありません。 – grantmcconnaughey

答えて

9
コメントで述べたシナリオの

簡単なデモ:

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

を私は十分な大き宣言された変数と、それは罰金だと呼び出した場合。私は、12-char型の変数を持っているので、12-char値を代入することは問題ではありません。

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#のコメントを見ました。あなたはthis constructorと呼んでいるようです。それはそれはあなたが明示的にサイズを指定する代わりにthis constructorを呼び出す必要が1かもしれないと思うし、それが取得するものをデフォルトサイズは言わないが、無理しない:

のOracleParameter(文字列、OracleType、Int32)を
パラメータ名、 データ型、および長さを使用するOracleParameterクラスの新しいインスタンスを初期化します。

...のようなもの:

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

私が見ることができない作成後にサイズをリセットする方法は、ありますない限り。 (私が使ったことはない!)。

+0

に見えます私のOracleParameter()コンストラクタに長さ12を追加すると、この問題が修正されます。あなたの助けに100万こんにちは。 – grantmcconnaughey

+0

間違いなく。再度、感謝します。 – grantmcconnaughey

関連する問題