Проста демонстрация на сценария, споменат в коментарите:
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). В зависимост от това къде го извиквате, може да нямате целия стек, разбира се.
Споменахте, че в бъдеще ще има различни съобщения за грешки. Трябва да сте сигурни, че всичко, което някога извиква това, дефинира променливите да бъдат достатъчно големи, за да се справят с всяко от вашите съобщения. Ако бяха съхранени в таблица, бихте могли да го автоматизирате полуавтоматизирано, в противен случай това ще бъде ръчна проверка за преглед на кода.
Добре, видях вашия коментар за c# след публикуването на това. Изглежда, че извиквате този конструктор ; това не казва какъв размер по подразбиране получава, но не е неразумно да мислим, че може да е 1. Така че трябва да извикате този конструктор вместо да укажете изрично размера:
... нещо като:
OracleParameter prm15 = new OracleParameter("out_str_message",
OracleDbType.Varchar2, 80);
Освен ако няма начин за нулиране на размера след създаването, което не виждам. (Не е нещо, което някога съм използвал!).