Proste demo scenariusza wspomnianego w komentarzach:
create or replace procedure p42(out_message out varchar2) as
begin
out_message := 'Test message';
end p42;
/
Jeśli nazywam to ze zmienną, która jest zadeklarowana wystarczająco duża, to jest w porządku. Mam zmienną 12-znakową, więc przypisanie 12-znakowej wartości nie stanowi problemu:
declare
msg varchar2(12);
begin
p42(msg);
end;
/
anonymous block completed
Ale jeśli popełnię błąd i sprawię, że zmienna wywołującego jest za mała, otrzymuję błąd, który widzisz:
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:
Stos błędów pokazuje zarówno wiersz procedury, w której wystąpił błąd (wiersz 3), jak i wiersz wywołujący, który go wyzwolił (wiersz 4). W zależności od tego, gdzie je wywołujesz, możesz oczywiście nie mieć całego stosu.
Wspomniałeś, że w przyszłości pojawią się różne komunikaty o błędach. Musisz upewnić się, że wszystko, co kiedykolwiek to wywoła, definiuje zmienne tak, aby były wystarczająco duże, aby poradzić sobie z dowolnymi wiadomościami. Gdyby były przechowywane w tabeli, można by to częściowo zautomatyzować, w przeciwnym razie będzie to ręczne sprawdzenie kodu.
OK, widziałem Twój komentarz w C# po opublikowaniu tego. Wygląda na to, że wywołujesz ten konstruktor ; to nie mówi, jaki ma domyślny rozmiar, ale nie jest nierozsądne, aby sądzić, że może to być 1. Więc musisz zadzwonić ten konstruktor zamiast tego wyraźnie określ rozmiar:
... coś takiego:
OracleParameter prm15 = new OracleParameter("out_str_message",
OracleDbType.Varchar2, 80);
Chyba że istnieje sposób na zresetowanie rozmiaru po utworzeniu, którego nie widzę. (Nie jest to coś, czego kiedykolwiek używałem!).