Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Erro muito pequeno no buffer da cadeia de caracteres no Oracle Stored Procedure


Demonstração simples do cenário mencionado nos comentários:
create or replace procedure p42(out_message out varchar2) as
begin
  out_message := 'Test message';
end p42;
/

Se eu chamar isso com uma variável declarada grande o suficiente, tudo bem. Eu tenho uma variável de 12 caracteres, portanto, atribuir um valor de 12 caracteres não é um problema:
declare
  msg varchar2(12);
begin
  p42(msg);
end;
/

anonymous block completed

Mas se eu cometer um erro e tornar a variável do chamador muito pequena, recebo o erro que você está vendo:
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:

A pilha de erros mostra a linha no procedimento que errou (linha 3) e a linha no chamador que o acionou (linha 4). Dependendo de onde você está chamando, você pode não ter a pilha inteira, é claro.

Você mencionou que haveria várias mensagens de erro no futuro. Você precisa ter certeza de que qualquer coisa que chame isso defina as variáveis ​​para serem grandes o suficiente para lidar com qualquer uma de suas mensagens. Se eles foram armazenados em uma tabela, você pode semiautomatizar isso, caso contrário, será uma verificação manual de revisão de código.

OK, vi seu comentário em c# depois de postar isso. Parece que você está chamando este construtor ; isso não diz o tamanho padrão, mas não é razoável pensar que pode ser 1. Portanto, você precisa chamar este construtor em vez de especificar o tamanho explicitamente:

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

A menos que haja uma maneira de redefinir o tamanho após a criação, o que não consigo ver. (Não é algo que eu já usei!).