Démo simple du scénario mentionné dans les commentaires :
create or replace procedure p42(out_message out varchar2) as
begin
out_message := 'Test message';
end p42;
/
Si j'appelle ça avec une variable déclarée assez grande, ça va. J'ai une variable de 12 caractères, donc l'attribution d'une valeur de 12 caractères n'est pas un problème :
declare
msg varchar2(12);
begin
p42(msg);
end;
/
anonymous block completed
Mais si je fais une erreur et que la variable de l'appelant est trop petite, j'obtiens l'erreur que vous voyez :
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:
La pile d'erreurs affiche à la fois la ligne de la procédure qui a généré une erreur (ligne 3) et la ligne de l'appelant qui l'a déclenchée (ligne 4). Selon l'endroit où vous l'appelez, vous n'aurez peut-être pas toute la pile, bien sûr.
Vous avez mentionné qu'il y aurait divers messages d'erreur à l'avenir. Vous devez vous assurer que tout ce qui l'appelle définit les variables suffisamment grandes pour faire face à n'importe lequel de vos messages. S'ils étaient stockés dans une table, vous pourriez semi-automatiser cela, sinon ce serait une vérification manuelle du code.
OK, j'ai vu votre commentaire c# après avoir posté ceci. Il semble que vous appeliez ce constructeur ; cela ne dit pas quelle taille par défaut il obtient, mais il n'est pas déraisonnable de penser que ce pourrait être 1. Vous devez donc appeler ce constructeur à la place de spécifier explicitement la taille :
... quelque chose comme :
OracleParameter prm15 = new OracleParameter("out_str_message",
OracleDbType.Varchar2, 80);
Sauf s'il existe un moyen de réinitialiser la taille après la création, ce que je ne vois pas. (Pas quelque chose que j'ai jamais utilisé !).