Jednoduchá ukázka scénáře zmíněného v komentářích:
create or replace procedure p42(out_message out varchar2) as
begin
out_message := 'Test message';
end p42;
/
Pokud to zavolám proměnnou, která je deklarována dostatečně velká, je to v pořádku. Mám 12znakovou proměnnou, takže přiřazení 12znakové hodnoty není problém:
declare
msg varchar2(12);
begin
p42(msg);
end;
/
anonymous block completed
Ale pokud udělám chybu a udělám proměnnou volajícího příliš malou, dostanu chybu, kterou vidíte:
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:
Zásobník chyb zobrazuje řádek v proceduře, která se vyskytla (řádek 3), a řádek volajícího, který ji spustil (řádek 4). V závislosti na tom, kde to voláte, nemusíte mít samozřejmě celý zásobník.
Zmínil jste, že v budoucnu se budou objevovat různé chybové zprávy. Musíte se ujistit, že cokoli, co to někdy volá, definuje proměnné tak, aby byly dostatečně velké, aby se vyrovnaly s jakoukoli vaší zprávou. Pokud by byly uloženy v tabulce, mohli byste to poloautomatizovat, jinak to bude ruční kontrola kontroly kódu.
OK, viděl jsem váš komentář v c# po odeslání tohoto příspěvku. Vypadá to, že voláte tento konstruktor ; to neříká, jakou výchozí velikost získá, ale není nerozumné si myslet, že by to mohlo být 1. Takže musíte zavolat tento konstruktor místo toho explicitně specifikovat velikost:
... něco jako:
OracleParameter prm15 = new OracleParameter("out_str_message",
OracleDbType.Varchar2, 80);
Pokud neexistuje způsob, jak obnovit velikost po vytvoření, což nevidím. (Ne něco, co jsem kdy použil!).