sql >> Base de Datos >  >> RDS >> Oracle

Error de búfer de cadena de caracteres demasiado pequeño en el procedimiento almacenado de Oracle

Demostración simple del escenario mencionado en los comentarios:

create or replace procedure p42(out_message out varchar2) as
begin
  out_message := 'Test message';
end p42;
/

Si lo llamo con una variable que se declara lo suficientemente grande, está bien. Tengo una variable de 12 caracteres, por lo que asignar un valor de 12 caracteres no es un problema:

declare
  msg varchar2(12);
begin
  p42(msg);
end;
/

anonymous block completed

Pero si cometo un error y hago que la variable de la persona que llama sea demasiado pequeña, aparece el error que está viendo:

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 pila de errores muestra tanto la línea en el procedimiento que produjo el error (línea 3) como la línea en la persona que llama que lo activó (línea 4). Dependiendo de dónde lo llame, es posible que no tenga toda la pila, por supuesto.

Usted mencionó que habría varios mensajes de error en el futuro. Debe asegurarse de que cualquier cosa que llame a esto defina las variables para que sean lo suficientemente grandes como para hacer frente a cualquiera de sus mensajes. Si estuvieran almacenados en una tabla, podrías semiautomatizarlos; de lo contrario, será una verificación de revisión de código manual.

OK, vi tu comentario de C# después de publicar esto. Parece que estás llamando a este constructor ; eso no dice qué tamaño predeterminado obtiene, pero no es descabellado pensar que podría ser 1. Por lo tanto, debe llamar a este constructor en lugar de especificar el tamaño explícitamente:

... algo como:

OracleParameter prm15 = new OracleParameter("out_str_message",
    OracleDbType.Varchar2, 80);

A menos que haya una forma de restablecer el tamaño después de la creación, que no puedo ver. (¡No es algo que haya usado nunca!).