Se você está recebendo o erro “ORA-01790:a expressão deve ter o mesmo tipo de dados que a expressão correspondente” no banco de dados Oracle, provavelmente é porque você está usando um operador como
UNION
, INTERSECT
, ou EXCEPT
para executar uma consulta composta, mas as colunas retornadas por cada consulta usam grupos de tipos de dados diferentes. Para corrigir esse problema, você precisará garantir que cada coluna retornada pela segunda consulta use o mesmo grupo de tipos de dados que a coluna correspondente na primeira consulta.
Exemplo de erro
Aqui está um exemplo de código que produz esse erro:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentId FROM Students;
Resultado:
ORA-01790: expression must have same datatype as corresponding expression
O problema aqui é que estou tentando combinar o
TeacherName
coluna na primeira consulta, com o StudentId
coluna na segunda consulta. No meu caso, o
TeacherName
coluna é um varchar(50)
coluna, mas o StudentId
coluna é um int
coluna. Isso faz com que o erro ocorra. Solução 1
A primeira (e provavelmente a mais comum) solução para o erro acima é garantir que temos a(s) coluna(s) correta(s) em cada consulta.
No meu caso, parece bastante óbvio que passei nas colunas erradas. Portanto, posso modificar a consulta acima da seguinte maneira:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentName FROM Students;
Resultado:
NOME DO PROFESSOR |
---|
Ben |
Faturar |
Cathy |
Ein |
Faye |
Jato |
Ponto |
Warren |
Ou eu poderia fazer o seguinte:
SELECT TeacherId, TeacherName FROM Teachers
UNION
SELECT StudentId, StudentName FROM Students;
Resultado:
ID DO PROFESSOR | NOME DO PROFESSOR |
---|---|
1 | Faye |
1 | Warren |
2 | Ben |
2 | Jato |
3 | Cathy |
3 | Ponto |
4 | Cathy |
4 | Ein |
5 | Faturar |
5 | Warren |
6 | Faturar |
Em ambos os casos, os tipos de coluna retornados pela segunda consulta corresponderam aos tipos retornados pela primeira consulta.
Solução 2
Em alguns casos, você pode descobrir que tem as colunas corretas, mas seus tipos não correspondem. Nesses casos, pode ser necessário converter uma das colunas em um tipo de dados diferente.
Usando nosso exemplo, poderíamos fazer isso:
SELECT TeacherName FROM Teachers
UNION
SELECT TO_CHAR(StudentId) FROM Students;
Resultado:
NOME DO PROFESSOR |
---|
1 |
2 |
3 |
4 |
5 |
6 |
Ben |
Faturar |
Cathy |
Warren |
Este provavelmente não é o melhor exemplo, pois combina nomes com IDs, mas tenho certeza que você entendeu. Conseguimos evitar o erro usando o
TO_CHAR(number)
função para converter o StudentId
coluna para um char
tipo.