ORA-06502: Guia definitivo para entender, diagnosticar e corrigir o erro ORA-06502 no Oracle

Pre

O que é ORA-06502 e por que ele ocorre

O erro ORA-06502, na forma completa “ORA-06502: PL/SQL: numeric or value error”, aparece quando uma operação PL/SQL tenta atribuir, converter ou armazenar um valor que não cabe no tipo de dados ou tamanho disponível. Em termos simples, é uma sinalização de que houve estouro de precisão, escala ou tamanho, ou ainda uma conversão inválida entre tipos. Este erro pode surgir tanto em blocos PL/SQL puros quanto em chamadas a procedures, funções ou pacotes que manipulam dados, variáveis, arrays (coleções) e buffers de saída.

ORA-06502 versus a pilha de erros: como interpretar o contexto

Ao observar o ORA-06502, é comum aparecer também uma linha de referência, por exemplo “PL/SQL: numeric or value error” seguido da linha onde a exceção foi levantada. Em ambientes com tracing ligado, você pode ver um stack trace com ORA-06502 envolvido. Compreender o contexto é crucial: pode ser uma atribuição direta a uma variável, uma conversão de tipos, ou o resultado de uma operação aritmética que excede a capacidade de armazenamento definida pela declaração de variável ou por uma coluna de tabela.

Causas comuns do ORA-06502

  • Conversões de tipos inadequadas: tentar atribuir um valor de tipo diferente sem conversão explícita adequada, por exemplo atribuir VARCHAR2 a NUMBER sem conversão.
  • Exceder a precisão ou a escala de um NUMBER: números com mais dígitos antes ou depois da vírgula do que o permitido pela definição NUMBER(precision, scale).
  • Excesso de tamanho em VARCHAR2: atribuir mais caracteres a uma variável VARCHAR2 ou a uma coluna com definição de tamanho menor.
  • Overflow de valor em data/hora: tentar armazenar um valor de data fora do intervalo permitido ou de forma incompatível com a declaração.
  • Buffer ou espaço insuficiente: em chamadas a DBMS_OUTPUT ou em buffers de saída/descritores de cursor, quando a saída excede o espaço reservado.
  • Trabalhos com coleções (TABLE, VARRAY) sem respeitar limites de índices ou tamanho de elementos.
  • Operações com tipos compostos (RECORDs) mal dimensionados ou com atribuições que não respeitam os campos.

Cenários práticos que costumam gerar ORA-06502

Exemplo 1: atribuição que excede a precisão de NUMBER

DECLARE
  v_val NUMBER(5,2);
BEGIN
  v_val := 1234.56; -- excede NUMBER(5,2) que permite até 999.99
END;

Neste caso, a atribuição provoca overflow de valor, levando ao ORA-06502. A solução é ajustar a declaração NUMBER(5,2) para comportar o valor esperado ou adaptar o valor a ser atribuído.

Exemplo 2: string para number sem conversão explícita

DECLARE
  v_num NUMBER;
  v_str VARCHAR2(20) := 'ABC123';
BEGIN
  v_num := v_str; -- erro: conversão implícita falha
END;

Converte-se incorretamente uma string não numérica para número. Em muitos casos isso gera ORA-01722, mas em cenários específicos com regras de conversão ou NLS, o ORA-06502 pode aparecer ao tentar armazenar o resultado da conversão em uma variável com restrições de tamanho ou formato.

Exemplo 3: buffer de saída com DBMS_OUTPUT

DECLARE
  v_buf VARCHAR2(2000);
  v_msg VARCHAR2(4000) := RPAD('X', 4000, 'X'); -- excede o buffer de saída
BEGIN
  DBMS_OUTPUT.PUT_LINE(v_msg);
END;

O erro pode ocorrer quando o tamanho da saída excede o buffer configurado pelo DBMS_OUTPUT.ENABLE. Ajustar o tamanho do buffer ou dividir a saída é a abordagem recomendada.

Exemplo 4: uso de VARCHAR2 em tabelas com limites menores

CREATE TABLE clientes (
  id NUMBER,
  cpf VARCHAR2(11)
);

DECLARE
  v_cpf VARCHAR2(14) := '123.456.789-00'; -- 14 caracteres, mas a coluna suporta 11
BEGIN
  INSERT INTO clientes (id, cpf) VALUES (1, v_cpf);
END;

A tentativa de armazenar mais caracteres do que o definido para a coluna resulta em ORA-06502 em alguns cenários de cast/driver de banco ao retornar resultados ou em blocos com validação de tamanho.

Como diagnosticar ORA-06502 de forma eficaz

1) Reproduzir com o mínimo possível de código

Isolar o trecho que dispara o erro facilita a identificação da variável ou do tipo envolvido. Tente reduzir o bloco a um exemplo mínimo que cause o erro, sem dependências externas.

2) Verificar declarações de variáveis e tipos

Compare os tipos de cada variável com os valores atribuídos a elas. Verifique se há consistência entre VARCHAR2, NUMBER, DATE, e se a declaração suporta a magnitude esperada.

3) Utilizar SQLCODE e SQLERRM

Em tratativas de exceções, registre o código de erro e a mensagem: SQLCODE e SQLERRM. Em muitos casos, a mensagem fornecida pelo ORA-06502 acompanha informações úteis sobre a linha e o objeto envolvido.

4) Conferir operações com coleções e buffers

Para coleções, confirme índices válidos e se os elementos respeitam a dimensão máxima. Para DBMS_OUTPUT, confirme o buffer com DBMS_OUTPUT.ENABLE(buffer_size => 1000000) ou outro valor adequado.

5) Analisar dados de entrada e regras de negócio

Valide entradas de usuários, integrações externas e regras de negócio que possam gerar valores fora do esperado antes de atribuir a variáveis ou persistir em tabelas.

Como corrigir ORA-06502: estratégias práticas

Validação de dados antes de atribuições

Antes de atribuir valores a variáveis, faça validações explícitas: tamanho, formato, faixa de números, e consistência de datas. Use funções como TO_NUMBER com máscara explícita, TO_CHAR para formatação, e checagens condicionais para prevenir estouros.

Uso correto de castings e conversões

Quando for necessário converter tipos, utilize conversões explícitas com formatos apropriados, por exemplo:

DECLARE
  v_num VARCHAR2(20) := '1234.56';
  v_val NUMBER(8,2);
BEGIN
  v_val := TO_NUMBER(v_num, '999999.99');
END;

Converta com máscara que reflita o valor esperado e trate exceções de conversão para evitar surpresas pelo locale (NLS).

Ajuste de precisão, escala e tamanho

Se a definição de NUMBER, VARCHAR2 ou DATE não atende às necessidades, ajuste a definição. Por exemplo, aumentar NUMBER(8,2) para comportar valores com mais dígitos ou ampliar VARCHAR2(n) para armazenar strings mais longas.

Tratar exceções com clareza

Use blocos de exceção específicos para capturar ORA-06502 e agir com mensagens úteis para o usuário final ou log para auditoria. Evite capturar tudo com WHEN OTHERS THEN sem tratamento adequado.

BEGIN
  -- código que pode gerar ORA-06502
EXCEPTION
  WHEN VALUE_ERROR THEN
    DBMS_OUTPUT.PUT_LINE('Erro de valor: verifique tipos e tamanhos.');
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Outro erro: ' || SQLCODE || ' - ' || SQLERRM);
END;

Uso adequado de records e %TYPE

Defina variáveis com o uso de %TYPE para manter consistência com as tabelas, evitando discrepâncias entre tamanho e tipo que possam levar a ORA-06502.

Boas práticas para evitar ORA-06502 no dia a dia

Validação de entrada de dados

Implemente validação de lado do servidor para garantir que entradas de usuário estejam dentro dos limites permitidos antes da persistência. Realize checagens de formato, tamanho e consistência entre campos relacionados.

Definição cuidadosa de esquemas

Projete esquemas com margens de segurança para tipos de dados. Evite usar precisão mínima onde existem margens de crescimento previsíveis. Considere padrões de dados, especialmente em aplicações que recebem dados de fronteiras geográficas ou de integrações externas.

Testes com casos de borda

Inclua testes que cobrem casos de máxima/mínima magnitude, strings longas, datas próximas de limites e cenários de produção com volumes altos de dados para capturar ORA-06502 antes de ir para produção.

Observabilidade e logs eficientes

Registre informações relevantes quando ocorrer ORA-06502: quais variáveis estavam envolvidas, qual a origem da atribuição, e quais são os limites que foram extrapolados. Isso facilita a correção sem depender de reprodução única em produção.

Ferramentas e recursos úteis para trabalhar com ORA-06502

DBMS_OUTPUT e buffer management

Configurar o buffer com DBMS_OUTPUT.ENABLE(buffer_size => 1000000) ajuda a captar mensagens de depuração sem perda de informações. Em ambientes com saída extensa, dividir mensagens em blocos menores é recomendado.

Uso de SQL Developer, DataGrip e IDEs

Ferramentas modernas permitem traçar exceções com highlighting, destacar a linha exata onde ORA-06502 ocorreu e fornecer sugestões rápidas de correção, além de integração com testes unitários de PL/SQL.

Trace e SQL tracing

Para cenários mais complexos, ative tracing para entender como os dados fluem pelas camadas. Observando o plano de execução e os valores de variáveis no momento da exceção facilita o diagnóstico de gargalos que levam ao ORA-06502.

Recursos oficiais e documentação

A documentação da Oracle descreve as mensagens de erro, cenários de ocorrência e melhores práticas para escrever código PL/SQL robusto, permitindo aos times de desenvolvimento alinhar convenções de tratamento de exceções com padrões corporativos.

Exemplos de código úteis para evitar ORA-06502

Exemplo A: validação pré-atribuição com NUMBER

DECLARE
  v_sal NUMBER(10,2);
  v_input VARCHAR2(20) := '12345678.90';
BEGIN
  IF REGEXP_LIKE(v_input, '^\d+(\.\d{1,2})?$') THEN
    v_sal := TO_NUMBER(v_input);
  ELSE
    RAISE_APPLICATION_ERROR(-20001, 'Entrada inválida para valor monetário');
  END IF;
END;

Exemplo B: ajuste de tamanho de VARCHAR2

DECLARE
  v_nome VARCHAR2(50);
BEGIN
  v_nome := 'Nome extremamente longo que pode exceder o limite';
  IF LENGTH(v_nome) > 50 THEN
    v_nome := SUBSTR(v_nome, 1, 50);
  END IF;
END;

Exemplo C: tratamento específico de retorno de funções

CREATE OR REPLACE FUNCTION get_limite(p_id NUMBER) RETURN NUMBER IS
  v_limite NUMBER(8,2);
BEGIN
  SELECT limite INTO v_limite FROM itens WHERE id = p_id;
  RETURN v_limite;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    RETURN 0;
  WHEN VALUE_ERROR THEN
    RETURN 99999; -- valor de falha controlada
END;

Conclusão: ORA-06502 como alarme de qualidade de código

ORA-06502 não é apenas uma mensagem de erro para corrigir rapidamente; é um indicador valioso de que a aplicação pode não estar validando adequadamente dados, não respeitando limites de tipos ou dimensionamentos de memória. Adotar práticas preventivas, validação de dados na origem, uso consciente de tipos de dados, tratamento de exceções específico e logs claros reduz significativamente a ocorrência desse erro em ambientes de produção. Com uma abordagem estruturada, você transforma o ORA-06502 de um obstáculo técnico em uma oportunidade de melhorar a robustez, a confiabilidade e a qualidade de suas aplicações Oracle.