Oracle
 sql >> Base de données >  >> RDS >> Oracle

Erreur de mémoire tampon de chaîne de caractères trop petite dans la procédure stockée Oracle

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é !).