ORA-00904: Guia completo para entender, diagnosticar e corrigir o Erro ORA-00904

Pre

O erro ORA-00904 é frequentemente citado por desenvolvedores, administradores de banco de dados e equipes de TI que trabalham com Oracle. Conhecido como “invalid identifier” em muitas mensagens de erro, ele surge quando o SQL tenta usar um identificador que não existe, não está acessível ou não está reconhecido pelo Oracle. Este artigo apresenta uma visão completa sobre o ORA-00904, abordando desde a sua definição até as melhores práticas para evitar que ele aconteça, com exemplos práticos, diagnósticos e soluções. Se você já se deparou com ORA-00904, este guia oferece um caminho claro para resolver o problema com eficiência.

O que é o ORA-00904?

O código ORA-00904 (muitas vezes exibido como ORA-00904: invalid identifier) indica que o Oracle encontrou um identificador inválido em uma instrução SQL. Em termos simples, o Oracle não reconhece o que foi escrito após a palavra-chave SELECT, FROM, WHERE ou outra parte da consulta. O identificador pode ser o nome de uma coluna, de uma tabela, de um apelido (alias) ou de uma função, que não existe no contexto da consulta.

ORA-00904 vs outros erros comuns

Comparado a outros erros de Oracle, o ORA-00904 costuma ter causas relativamente diretas, como digitação incorreta, uso inadequado de aspas, ou tentativa de referenciar um identificador que não foi criado. Em contrapartida, erros como ORA-00942 (ta reflexão: tabela ou view inexistente) costumam indicar ausência de objeto no schema, enquanto ORA-00957 aponta para a tentativa de inserir um valor nulo em uma coluna que não permite nulos. Entender o contexto ajuda a diferenciar rapidamente a origem do ORA-00904.

Causas comuns do ORA-00904

Diversas situações podem levar ao ORA-00904. Dentre as mais frequentes, destacam-se:

1. Nome de coluna incorreto ou inexistente

O motivo mais comum é digitar errado o nome da coluna. Um simples erro de grafia, uso de maiúsculas/minúsculas inadequadas ou omissão de um caractere pode acionar o ORA-00904. Por exemplo, tentar selecionar SELECT SALARy FROM EMPLOYEES pode falhar caso a coluna seja realmente SALARY.

2. Uso de palavras reservadas como identificadores

Empregar palavras reservadas da linguagem SQL como nomes de colunas ou tabelas pode gerar ORA-00904. Nomes como DATE, NUMBER ou palavras específicas do domínio podem colidir com a sintaxe do Oracle, levando à mensagem de identificador inválido.

3. Identificadores entre aspas e sensibilidade a maiúsculas

Se um identificador for criado com aspas, o Oracle torna-o sensível a maiúsculas e minúsculas. Por exemplo, CREATE TABLE "Vendas" (...) cria uma tabela com o nome exatamente como escrito. Referenciá-la sem aspas ou em outro caso, como SELECT * FROM VENDAS, pode gerar ORA-00904.

4. Referência a colunas através de aliases confusos

Aliases em consultas podem confundir, especialmente quando usados de forma aninhada, ou quando se tenta referenciar uma coluna usando o alias antes dele ser definido. Em alguns cenários, o ORA-00904 aparece ao tentar usar um alias de uma coluna que não existe no escopo atual da consulta.

5. Uso de funções ou expressões não apoiadas

Chamar funções inexistentes, ou referenciar colunas dentro de funções com nomes incorretos, pode retornar ORA-00904. Verifique se todas as funções utilizadas realmente existem, estão escritas corretamente e são compatíveis com o tipo de dado.

Como diagnosticar ORA-00904 de forma eficaz

Quando surge ORA-00904, uma abordagem estruturada facilita a identificação da raiz do problema. Abaixo está um roteiro prático de diagnóstico:

1. Verifique o identificador que está sendo usado

Revise cuidadosamente o nome da coluna, da tabela ou do alias envolvido na instrução. Confirme se o identificador está escrito exatamente como criado, sem erros de grafia e sem caracteres inesperados.

2. Consulte a data dictionary para confirmar a existência

Utilize as visões do data dictionary para confirmar a existência de colunas e tabelas. Por exemplo, para confirmar se uma coluna existe em uma tabela, você pode consultar:

SELECT COLUMN_NAME
FROM ALL_TAB_COLUMNS
WHERE TABLE_NAME = 'NOME_DA_TABELA'
  AND COLUMN_NAME = 'NOME_DA_COLUNA';

Note que os nomes de objetos no Oracle são armazenados em letras maiúsculas no data dictionary, a menos que tenham sido criados com aspas e mantidos com maiúsculas/minúsculas sensíveis. Isso ajuda a identificar se o identificador realmente existe ou se houve uma divergência de maiúsculas.

3. Verifique o escopo e o contexto da consulta

Analise se o identificador está acessível no contexto da instrução. Em consultas com várias tabelas e subconsultas, é comum perder o rastro de qual coluna pertence a qual tabela, o que pode gerar ORA-00904.

4. Examine aspas e sensibilidade de identificadores

Se a sua base utiliza identificadores criados com aspas, certifique-se de referenciá-los exatamente como foram criados. Caso contrário, o Oracle pode interpretar o identificador de forma diferente, levando ao erro.

5. Verifique se há conflito com palavras reservadas

Bit a bit, confira se o identificador não é uma palavra reservada ou uma expressão que cause ambiguidade na query.

Como corrigir ORA-00904: passos práticos

A correção do ORA-00904 depende da causa. Abaixo estão passos práticos que costumam resolver a maioria dos casos, com exemplos claros:

Passo 1: Corrija erros de grafia

Se o problema é apenas um erro de digitação, ajuste o nome da coluna para o correto. Exemplo:

-- erro comum
SELECT SALARy FROM EMPLOYEES;

-- correção
SELECT SALARY FROM EMPLOYEES;

Passo 2: Ajuste o uso de aspas e maiúsculas

Se o identificador foi criado com aspas, mantenha a referência exatamente como foi definido:

-- se criado como "EmployeeName"
SELECT "EmployeeName" FROM Employees;

-- se criado sem aspas, use maiúsculas normais
SELECT EMPLOYEENAME FROM EMPLOYEES;

Passo 3: Evite conflitos com palavras reservadas

Altere o nome do identificador para evitar conflito com palavras reservadas. Se não puder mudar esse nome, use aspas e mantenha exatamente como criado:

SELECT "DATE" FROM "SPECIAL_TABLE";

Passo 4: Verifique a existência do objeto no schema

Certifique-se de que a tabela e a coluna realmente existam e que você tem permissão para acessá-las. Se estiver em um esquema diferente, faça o ajuste com o nome do esquema:

SELECT t.COLUMN_NAME
FROM ALL_TAB_COLUMNS t
JOIN ALL_TABLES ta ON t.TABLE_NAME = ta.TABLE_NAME
WHERE ta.OWNER = 'SCHEMA'
  AND ta.TABLE_NAME = 'NOME_DA_TABELA'
  AND t.COLUMN_NAME = 'NOME_DA_COLUNA';

Passo 5: Revise o uso de aliases

Garanta que os aliases estejam sendo referenciados corretamente e dentro do escopo da consulta. Um alias incorreto pode provocar ORA-00904.

Passo 6: Use ferramentas de diagnóstico

Ferramentas como SQL Developer, TOAD ou Oracle Enterprise Manager ajudam a identificar rapidamente detalhes da consulta. Além disso, usar a função de “Show Errors” após criar ou compilar objetos pode trazer insights úteis sobre identidades inválidas.

Boas práticas para evitar ORA-00904

Adotar boas práticas de nomenclatura e desenvolvimento reduz significativamente a incidência do ORA-00904. Confira algumas recomendações:

Nomenclatura consistente

Defina convenções para nomes de tabelas e colunas. Uma prática comum é usar nomes descritivos em maiúsculas sem espaços, com palavras separadas por underlines, por exemplo, EMPLOYEE_SALARY.

Uso de aspas apenas quando necessário

Casos que exigem aspas devem ser bem documentados. Evite criar objetos com aspas para não enfrentar problemas de sensibilidade a maiúsculas/minúsculas posteriormente.

Validação automática de esquemas

Implemente pipelines de validação que confirmem a existência de colunas-chave antes de executar consultas críticas. Scripts de verificação podem varrer o data dictionary para confirmar nomes esperados.

Tratamento de ambientes diferentes

Em ambientes de desenvolvimento, teste e produção, mantenha a consistência de nomes. Diferenças entre esquemas podem levar a ORA-00904 em deploys entre ambientes.

Casos de uso comuns com ORA-00904

A seguir, apresentamos situações reais onde o ORA-00904 costuma aparecer, com explicações sobre como evitar ou corrigir o problema.

Caso 1: Nome de coluna incorreto em JOIN

Erro típico: você referencia uma coluna que não existe nesse conjunto de tabelas. A correção envolve validar os nomes de coluna de cada tabela envolvida no JOIN e ajustar a referência.

SELECT e.id, e.nome, d.descricao
FROM employees e
JOIN departments d ON e.dept_id = d.id;

Se a coluna na tabela de funcionários for department_id, a instrução correta seria:

SELECT e.id, e.nome, d.descricao
FROM employees e
JOIN departments d ON e.department_id = d.id;

Caso 2: Identificadores criados com aspas

Quando um identificador foi criado com aspas, é necessário referenciá-lo exatamente com a mesma grafia e uso de maiúsculas/minúsculas:

CREATE TABLE "SalesData" (
  "Month" VARCHAR2(20),
  "Amount" NUMBER
);

SELECT "Month", "Amount" FROM "SalesData";

Caso 3: Palavras reservadas usadas como nomes

Se o identificador é uma palavra reservada, renomeie-o ou utilize aspas para delimitar o identificador:

ALTER TABLE "ORDER" RENAME TO ORDERS;
SELECT "ORDER" FROM ORDERS;

Caso 4: Referência incorreta a alias

Ao usar aliases, mantenha-os consistentes ao longo da consulta. Exemplo incorreto:

SELECT a.salary, b.total
FROM employees a
JOIN salaries b ON a.id = b.emp_id
WHERE a.name = 'Fulano';

Correção adequada, assegurando que aliases existam e sejam usados corretamente:

SELECT e.salary, s.total
FROM employees e
JOIN salaries s ON e.id = s.emp_id
WHERE e.name = 'Fulano';

Ferramentas de diagnóstico e resolução

Fazer uso de ferramentas apropriadas facilita o diagnóstico rápido do ORA-00904. Abaixo estão opções comuns:

  • SQL Developer: ofereçe autocompletar, verificação de nomes de colunas e validação de consultas.
  • TOAD for Oracle: visualização de dependências de objetos, verificação de consistência de esquemas.
  • Oracle SQL*Plus/SQLcl: comandos de melhoria de depuração, exibição de mensagens de erro completas.
  • OEM (Oracle Enterprise Manager): monitoramento de objetos, análise de performance e consistência do dicionário de dados.

Além disso, recursos internos do Oracle, como visualizar dependências de objetos e consultar o data dictionary, ajudam a confirmar a existência de tabelas e colunas envolvidas na query:

-- Exemplo: inspeção rápida de colunas de uma tabela
SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH
FROM ALL_TAB_COLUMNS
WHERE TABLE_NAME = 'NOME_DA_TABELA'
ORDER BY COLUMN_ID;

Exemplos de código úteis para ORA-00904

Abaixo estão alguns cenários exemplificados para referência prática. Use-os como modelos para corrigir operações reais.

Exemplo 1: Corrigir uma consulta simples com erro de coluna

-- Erro
SELECT salario FROM funcionario;

-- Correção (supondo que a coluna correta seja SALARY)
SELECT SALARY FROM FUNCIONARIO;

Exemplo 2: Contagem com coluna existente em várias tabelas

SELECT t1.coluna1, t2.coluna2
FROM tabela1 t1
JOIN tabela2 t2 ON t1.id = t2.id;

Exemplo 3: Consulta com alias aninhado e necessidade de alias explícito

SELECT e.id AS emp_id, e.nome AS emp_nome, d.descricao AS dept_desc
FROM employees e
JOIN departments d ON e.dept_id = d.id;

Diferenças entre ORA-00904 e outros erros de identificador

Embora relacionados, ORA-00904 é específico para identificadores inválidos. Outros códigos que podem surgir em contextos parecidos incluem:

  • ORA-00942: tabela ou view não existente ou não acessível
  • ORA-00904: invalid identifier (identificador inválido) – geralmente relacionado a colunas, tabelas ou alias inexistentes/ilegitimos
  • ORA-06550/PLS-####: erros durante compilação de código PL/SQL, que podem apontar para identificadores inválidos dentro de blocos PL/SQL

Perguntas frequentes sobre ORA-00904

A seguir, respostas rápidas para dúvidas comuns que aparecem em equipes técnicas:

O que causa ORA-00904?

Identificadores inválidos: nomes de colunas, tabelas, alias ou funções que não existem ou estão incorretos no contexto da consulta.

Posso evitar ORA-00904 apenas escrevendo SQL simples?

Sim, práticas simples ajudam, mas a causa real pode persistir se houver inconsistência entre nomes esperados e nomes existentes. Valide sempre com o data dictionary e mantenha uma convenção de nomenclatura clara.

ORA-00904 ocorre apenas com SELECT?

Embora comum em consultas SELECT, ORA-00904 pode ocorrer em instruções DML (INSERT, UPDATE, DELETE) quando um identificador errado é usado na cláusula SET ou na cláusula WHERE.

Como diagnosticar rapidamente em produção?

Verifique a mensagem de erro completa, o trecho da query que dispara o ORA-00904 e consulte as definições de tabela/coluna no schema relevante usando o data dictionary. Em ambientes de produção, a reprodução em um ambiente de teste ajuda a confirmar a correção sem impacto.

Conclusão

O ORA-00904 é um dos erros mais comuns que aparecem durante o desenvolvimento de aplicações Oracle. Embora pareça simples, muitas vezes envolve nuances como sensibilidade a maiúsculas/minúsculas, nomes criados com aspas, ou referências a objetos em schemas diferentes. Com as práticas apresentadas neste guia — confirmação de nomes no data dictionary, atenção a aspas, aliases corretos, e uso de ferramentas de diagnóstico — você ganha velocidade para diagnosticar, corrigir e prevenir o ORA-00904. Adote uma abordagem sistemática, padronize nomenclaturas e valide a existência de colunas e tabelas antes de executar consultas mais complexas. Assim, o ORA-00904 passa a ser um problema que pode ser resolvido de forma previsível, reagindo com soluções rápidas e eficientes.