[RESOLVIDO] - Query simples não funciona no Oracle. Onde eu errei?

Olá pessoal!

Estou com um problema na seguinte query:

Select IDGRUPOPRODUTOS from INDICE_SETORIAL where ANO = TO_CHAR('05/2005', 'YYYY') AND MES = TO_CHAR('05/2005', 'MM');

Estoura o erro: ORA-01722: número inválido

Eu tenho uma View que está com o mesmo comando TO_CHAR() e funciona normal.

ANO varchar2
MES varchar2

Obrigado.

Utechii,

TO_CHAR() só é usado com campos DATE ou DATETIME, ou seja, tens que passar a data completa, não somente o mês e o ano. O certo seria:

to_char(‘01/05/2005’,‘YYYY’)

Veja http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions180.htm

Pois é Kleyber.

Eu usei dessa forma que vc disse e mesmo assim estoura esse erro…

Estou usando esta query num botão AJAX de uma aplicação de CONTROLE. Lá, eu passo no lugar desta data “05/2005”, a variável que eu criei para aquela app. O campo se chama {PERIODO_INDICE}. E ele está no formato MM/YYYY.

Não vai funcionar. O parâmetro a ser passado para o Oracle tem que ser formato de data inteira, e o campo a ser passado como parâmetro também.

E porque na VIEW funciona?

CREATE OR REPLACE FORCE VIEW "ROOT"."VIEW_PRECO_MEDIO_DADOS" ("EMPRESAS_IDEMPRESAS", "ENCARGOS", "VENDAINTERNAT", "VENDAINTERNAR", "PRODUTOS_IDPRODUTOS", "PERIODO", "PERIODO_UPDATE", "ANO", "MES") AS SELECT cr.EMPRESAS_IDEMPRESAS, cr.ENCARGOS, pr.VENDAINTERNAT, pr.VENDAINTERNAR, pr.PRODUTOS_IDPRODUTOS, TO_CHAR(pr.PERIODO, 'MM')||'/'||TO_CHAR(pr.PERIODO, 'YYYY') AS PERIODO, pr.PERIODO AS PERIODO_UPDATE, cr.ANO, cr.MES FROM COMPLEMENTORAC cr, PRODUCAORAC pr WHERE cr.EMPRESAS_IDEMPRESAS IN (SELECT EMPRESAS_IDEMPRESAS FROM COMPLEMENTORAC) AND cr.ANO = TO_CHAR(pr.PERIODO, 'YYYY') AND cr.MES = TO_CHAR(pr.PERIODO, 'MM') AND pr.EMPRESAS_IDEMPRESAS = cr.EMPRESAS_IDEMPRESAS;

Que tipo de campo é pr.PERIODO ?

Ele é do tipo DATE. Assim como meu campo da tela {PERIODO_INDICE}.

Onde está esse campo no SELECT que mostraste no primeiro post?

Fiz ele assim:

$sql="Select IDGRUPOPRODUTOS from INDICE_SETORIAL where ANO = TO_CHAR({PERIODO_INDICE}, 'YYYY') AND MES = TO_CHAR({PERIODO_INDICE}, 'MM')";

Passando o {PERIODO_INDICE} para limitar minha busca.
Estou usando uma data qualquer para testar a query no SQL Developer. Mas o esquema original é esse aí acima.

Os campos ANO e MES da tabela INDICE_SETORIAL são de que tipo?

Está no primeiro post… rsrs

ANO varchar2
MES varchar2

Bom, sem saber todo o contexto é complicado dar um veredito. O erro informa que “A tentativa de conversão de um String para um número falhou porque o String não é um número literal válido. Somente campos numéricos ou campos de carácter contendo dados numéricos podem ser usados em funções ou expressões aritméticas. Somente campos numéricos podem ser adicionados ou subtraídos dos dados.”
Isso significa dizer que estás tentando converter um string em um número e está dando erro. Sugiro pegar o código do erro do Oracle e pesquisar no Google, então vais verificar o que pode ter acontecido no teu caso.

Verifiquei em vários locais na internet… Todos usam a função TO_CHAR() do mesmo modo que estou usando, não entendo o porquê deste conflito no ORACLE.

Estou passando pra CHAR uma varável do tipo DATE, só isso, e usando a formatação para pegar ANO=‘YYYY’ e MES = ‘MM’, assim como ja realizei antes, na view que está acima.

campos no SC configurados como YYYY/MM ou vice verça ele completa com 00 do dia, sendo assim da erro mesmo

tem que primeiro completar com o dia 01 pelomenos dai enviar como parametro

o SC vai devolve algo como 2016/09/00 << trate o 00 e coloque 01

Então William, na real no SC ainda nem testei, pois estou tentando rodar ela direto no SQL Developer pra poder testar e ver o que retornou, depois que tiver correto ai eu passo pro SC. Ainda nem consegui rodar no próprio SGDB. :frowning:

Tente isso:

$sql="Select
		IDGRUPOPRODUTOS
	  from
	  	INDICE_SETORIAL
	  where
	  	ANO = TO_CHAR(to_date({PERIODO_INDICE}, 'dd/mm/yyyy'), 'YYYY') AND
   		MES = TO_CHAR(to_date({PERIODO_INDICE}, 'dd/mm/yyyy'), 'MM')";

Oi Thyago tudo bom?

Então cara, eu havia testado desse jeito e tbm não me retornou nada no {meus_dados}, dei um echo no $sql pra ver como tava e ficou assim:

Select IDGRUPOPRODUTOS from INDICE_SETORIAL where ANO = TO_CHAR(to_date('05/2005', 'dd/mm/yyyy'), 'YYYY') AND MES = TO_CHAR(to_date('05/2005', 'dd/mm/yyyy'), 'MM')

Adicionei as aspas simples pra ver se mudava alguma coisa, mas não resolveu, no SQL Developer tbm testei usando do jeito que está acima já com a data chumbada no código e tbm nada, ele não estoura erro mas tbm não me retorna os dados.

Quando eu coloco direto no ANO e MES os respectivos valores 2005 e 05 ele me retorna um array com 15 registros. Por isso sei que está com algum problema, infelizmente parece que ele não consegue quebrar a data no estilo da máscara.

O estranho é que fiz testes utilizando APENAS o ANO e funciona… Mas daí meu filtro fica furado pois preciso do MES tbm.

ficou assim:

Select IDGRUPOPRODUTOS from INDICE_SETORIAL where ANO = TO_CHAR(TO_DATE('05/2005', 'MM/YYYY'), 'YYYY');

Porque com o MES ele não consegue distinguir os valores?

Pq a comparação deve estar sendo 01 = 1

Thyago, quando vc fala do 01=1 vc se refere ao DIA da respectiva data? Se for eu fiz o teste tbm utilizando assim: 01/05/05 e 01/05/2005.
Com as máscaras corretas DD/MM/YYYY e DD/MM/YY.