Duvida consulta SQL no Oracle

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Galako
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Seg, 29 Ago 2016 10:13 am

Bom dia,

Estou conseguinte duvida no que está ocorrendo quando efetuo a consulta abaixo no banco de dados Oracle.

Selecionar tudo

 
SELECT H.MAQUINA,
       PR.COD,
       H.TURNO
FROM HISTORICO,
     (SELECT DISTINCT(P.ID) AS PID, P.CODIGO AS COD
      FROM PRODUTO P, TEXTO_LOCALD TL
      WHERE P.TEXTOID = TL.ID AND LINGUAGEM = 1) PR
WHERE PR.PID = H.PRODUTOID
AND   H.SEQUENCIA LIKE '0001%'
AND   H.CLASSE = 1
AND   H.DATA_TRAB = TO_DATE('2016-08-28','YYYY-MM-DD')
AND   H.TURNO IN (1,2,3)
AND   PR.COD IN (6383,4407,4485,4496,4501)
GROUP BY H.MAQUINA,PR.COD,H.TURNO
/

O que ocorre, quando efetuou a consulta pela primeira vez ela executa normalmente, porém, se for executar novamente a mesma consulta ela ocorre o erro ORA-01722: número inválido.

Após analisar verifiquei que foram cadastrados códigos de produtos com letras também na tabela produto e se colocar apóstrofos nessa clausula

Selecionar tudo

PR.COD IN ('6383','4407','4485','4496','4501')
O Oracle efetua a consulta N vezes.

Minha duvida é a seguinte, porque o Oracle executa a consulta na primeira vez e na segunda vez ela ocorre erro? Efetuei a consulta em outras datas e algumas ocorre o erro e em outras não ocorre o erro.

O banco utilizado é o Oracle 11g.
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Boa tarde,

Se o campo COD da PODUTO não for numérico, você precisa informar as aspas.

Não entendi o "o Oracle efetua a consulta N vezes".

Esta causando um produto cartesiano?
Galako
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Seg, 29 Ago 2016 10:13 am

spernega escreveu:Boa tarde,

Se o campo COD da PODUTO não for numérico, você precisa informar as aspas.

Não entendi o "o Oracle efetua a consulta N vezes".

Esta causando um produto cartesiano?

Spernega, quis dizer com "o Oracle efetua a consulta N vezes", é que posso executar varias vezes sem ocorrer qualquer ERRO.

Minha duvida ainda é o porque o erro ORA-01722 ocorre somente na segunda vezes que vou efetuar a consulta? E há algumas datas que vou efetuar a consulta e o erro não ocorre.

Desculpe se me expressei mal anteriormente.
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

De fato é esquisito executar na primeira e dar erro na segunda.

Você está usando Sqlplus, Sqldeveloper, ...? (talvez isso possa significar alguma coisa)

O único parâmetro que você está alterando é a data?

Mais uma, produtoid da historico é do mesmo data type da pid da produto?
Galako
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Seg, 29 Ago 2016 10:13 am

Estou utilizando o Sqlplus e o PL\SQL Developer, está query é executada no Crystal reports que também ocorre erro.

O campos que são alterados é a H.DATA_TRAB e a PR.COD, onde na PR.COD passo os códigos disponíveis para o dia, onde eu posso escolher somente 1 ou varios.

Sim, a produtoid da historico é do mesmo data type da pid da produto.
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

É , essa ta difícil.

A única coisa que eu vejo que poderia influenciar é em relação aos códigos terem que estar ente aspas simples.

Vamos ver se alguém mais do fórum tem alguma outra solução.
Avatar do usuário
adrianoturbo
Moderador
Moderador
Mensagens: 393
Registrado em: Qui, 20 Mar 2008 4:09 pm
Localização: Brasília
Adriano Alves
---Para cada problema dificil existe uma solução simples.----

Brother , me parece que está armazenando números como strings no processo de conversão .
Não entendi o porque de usar uma função para retornar o mesmo valor que na coluna que já é definida com o tipo date ,como segue abaixo :

Selecionar tudo

AND   H.DATA_TRAB = TO_DATE('2016-08-28','YYYY-MM-DD')
Quando seria mais prático usar o simples é seguro :

Selecionar tudo

AND   H.DATA_TRAB ='2016-08-28' 
Ferrramentas de OLAP como é o caso do Crystal Reports geralmente possuem dificuldades de entender os parâmetros NLS .
No seu caso especificado está atribuído justamente aos NLS_NUMERIC_CHARACTERS, no processo de conversão.
Acredito que usando o simples é seguro,conforme o código lá em cima já resolveria ... mas existem outras alternativas como :
-Revisar a instalação da ferramenta de OLAP e setar a opção de NLS_NUMERIC_CHARACTERS
-no seu próprio select inserir o parâmetro NLS_DATE_LANGUAGE

Selecionar tudo

AND   H.DATA_TRAB = TO_DATE('2016-08-28','YYYY-MM-DD', 'nls_date_language = PORTUGUESE')
E direto do túnel do tempo do Glufke temos outras soluções interessantes :
http://glufke.net/oracle/viewtopic.php?t=6541

Boa sorte !!!
Galako
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Seg, 29 Ago 2016 10:13 am

Opa, Adriano.

Obrigado pelas dicas, porém as datas estavam assim porque retirei o select diretamente do Crystal Reports e faz a formatação deles assim por padrão dele.

Mas este ainda não é o ponto, porque o erro não ocorre somente no Crystal Reports, está ocorrendo em outras ferramentas e mesmo alterando a formatação da data.
Avatar do usuário
adrianoturbo
Moderador
Moderador
Mensagens: 393
Registrado em: Qui, 20 Mar 2008 4:09 pm
Localização: Brasília
Adriano Alves
---Para cada problema dificil existe uma solução simples.----

Brother ,seguinte ... para que possamos entender ... essa query que está rodando é extraída diretamente do Crystal Reports não é mesmo ? Tipo você vai lá em Database ,Show SQL Query e gera um query do seu relatório e roda ela no SQLPLUS ,SQLDEVELOPER ,entre outros e apresenta esse erro ?
Quando está tentando converter um caractere do tipo string em número ,pode ser que essa string não deva estar sendo convertida corretamente ,aparentemente o Crystal esteja fazendo um conversão diferente que o banco entenda.
Experimente fazer querys dentro do banco sem ser a gerada pelo Crystal e veja se o erro persiste.
geovani
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Sáb, 06 Ago 2016 9:22 am
Localização: Joinville-SC
Contato:
Geovani Cristofolini
Consultor de Business intelligence
http://useweknow.com

Opa!
Minha duvida é a seguinte, porque o Oracle executa a consulta na primeira vez e na segunda vez ela ocorre erro? Efetuei a consulta em outras datas e algumas ocorre o erro e em outras não ocorre o erro.
Sugestão:
O fato de em algumas datas ocorrer o erro e em outras não, entendo que tem algo a ver com os registros existentes. Sugiro uma análise em um determinado dia que está dando erro e verificar os dados que ele retorna, vai tirando os filtros até achar o campo que está dando o erro "ORA-01722: número inválido."
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes