Aprenda PL/SQL

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
  

Mensagemem Seg, 29 Ago 2016 11:09 am

Bom dia,

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

Código: Selecionar todos

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 na clausula 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.
Galako

Mensagemem Seg, 29 Ago 2016 2:22 pm

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
Localização: São Paulo - SP

Mensagemem Seg, 29 Ago 2016 3:34 pm

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.
Galako

Mensagemem Seg, 29 Ago 2016 3:42 pm

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?
spernega
Localização: São Paulo - SP

Mensagemem Seg, 29 Ago 2016 4:03 pm

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.
Galako

Mensagemem Seg, 29 Ago 2016 4:20 pm

É , 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.
spernega
Localização: São Paulo - SP

Mensagemem Seg, 29 Ago 2016 6:08 pm

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 :

Código: Selecionar todos
AND   H.DATA_TRAB = TO_DATE('2016-08-28','YYYY-MM-DD')


Quando seria mais prático usar o simples é seguro :
Código: Selecionar todos
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
Código: Selecionar todos
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 :
viewtopic.php?t=6541

Boa sorte !!!
adrianoturbo
Localização: Brasília

Adriano Alves
---Para cada problema dificil existe uma solução simples.----

Mensagemem Ter, 30 Ago 2016 1:15 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.
Galako

Mensagemem Ter, 30 Ago 2016 10:04 am

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.
adrianoturbo
Localização: Brasília

Adriano Alves
---Para cada problema dificil existe uma solução simples.----

Mensagemem Qua, 31 Ago 2016 3:19 pm

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."
geovani
Localização: Joinville-SC

Geovani Cristofolini
Consultor de Business intelligence
http://useweknow.com



Voltar para SQL

Quem está online

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