Erro ORA-01861 gravando data no Oracle

Estou pegando dados de um arquivo texto e gravando no Oracle, mas sempre recebo um:
ORA-01861: o literal não corresponde à string de formato
O formato das datas no .txt tá assim:2008-11-01
Mas eu quero gravar dessa forma 01/11/2008
No meu insert, eu faço isso: TO_DATE(?,‘DD/MM/YYYY’)

Tentei fazer assim para formatar antes do insert:

[code]
public static Date strToDate(String s){
SimpleDateFormat sdf1 = new SimpleDateFormat(“yyyy-MM-dd”);//formato de entrada
java.sql.Date data = new Date(new java.util.Date().getTime());
if(s!=null && !s.isEmpty()){
try {
java.util.Date d = sdf1.parse(s);
sdf1.applyPattern(“dd/MM/yyyy”);//formato de saída
java.sql.Date dataFinal = new Date(d.getTime());
return dataFinal;
}catch (ParseException e){
e.printStackTrace();
}

 }
 return data;//nunca ocorre

}[/code]

Mas o banco grava o dado como 0008-11-01(com zero!)

Agradeço qualquer ajuda!

As datas não tem formato, você usa o DateFormat para montar uma data a partir de uma String, ou gerar uma String com a data formatada, mas quando é um objeto java.util.Date ele não tem formato algum.

Você está persistindo o dado como Date? Você pode retornar diretamente o objeto d. Ele tem a data correta?

[quote=PaulH]Estou pegando dados de um arquivo texto e gravando no Oracle, mas sempre recebo um:
ORA-01861: o literal não corresponde à string de formato
O formato das datas no .txt tá assim:2008-11-01
Mas eu quero gravar dessa forma 01/11/2008
No meu insert, eu faço isso: TO_DATE(?,‘DD/MM/YYYY’)

Tentei fazer assim para formatar antes do insert:

[code]
public static Date strToDate(String s){
SimpleDateFormat sdf1 = new SimpleDateFormat(“yyyy-MM-dd”);//formato de entrada
java.sql.Date data = new Date(new java.util.Date().getTime());
if(s!=null && !s.isEmpty()){
try {
java.util.Date d = sdf1.parse(s);
sdf1.applyPattern(“dd/MM/yyyy”);//formato de saída
java.sql.Date dataFinal = new Date(d.getTime());
return dataFinal;
}catch (ParseException e){
e.printStackTrace();
}

 }
 return data;//nunca ocorre

}[/code]

Mas o banco grava o dado como 0008-11-01(com zero!)

Agradeço qualquer ajuda![/quote]

para você inserir você só colocaria a ? sem to_date nem nada e passava como parâmetro no seu jdbc um java.sql.Date. Você colocar um to_date e a interrogação, você teria que passar String formatada, mas isso ja vi problemas incomuns na hora de formatar e aliás no bom português esse é o jeito porto de inserir um campo data na base.

tenta fazer como eu falei ai em cima e se você não conseguir, ainda tiver problemas ou algo assim posta ai seu código na parte que faz o insert e o stack trace completo.

Rodrigo Sasaki e maior_abandonado, simplifiquei as coisas e a única coisa que faço antes de inserir é isso:

[code]
public static String checkStringSizeData(String s,int n) {
if(s.length()>n){
String cut= s.substring(0,n);
//System.out.println(“Valor da Data:”+cut);
return cut;
}else{
return “1999-01-01”;//coloca um valor padrão nos nulls

    }

} [/code]
para cortar os minutos e por um valor padrão nas datas com null no arquivo txt, mas ainda recebo:
ORA-01861: o literal não corresponde à string de formato
As datas vem do txt nesse formato:
2008-11-20 00:00:00.0 exceto algumas que estão null.
Se eu tirei o To_Date, o que pode ser?

Faltou o código de como faz o insert.

Faço assim:

 pstmt.setInt(1,checkIntegerSize(ds.getString("ID_REQ"),10));		
 pstmt.setObject(2,(checkStringSizeData(ds.getString("DATAVENDA").trim(),10)));
 pstmt.setObject(3,(checkStringSizeData(ds.getString("DATACOMPRA").trim(),10)));
...resto do código, e fechar pstmt e conexão

meu insert final static String query= “INSERT INTO MANUTENCAO(ID_REQ,DATAVENDA,DATACOMPRA) VALUES (?,?,?)”;
esse DS é o parser que eu pego os dados do arquivo texto.

e o que faz esse checkStringSizeData ?

Quando você chega nesse ponto do código, qual o valor de:ds.getString("DATAVENDA").trim() ?

Rodrigo, eu já postei o checkStringSizeData acima, exemplo da saída depois dotrim e do checkStringSizeData:

Valor da Data:2007-11-01
Valor da Data:2009-12-20
Valor da Data:2010-10-21
Valor da Data Nula:1999-01-01

O formato tá OK, o problema tá em jogar no BD…

já tentou setar com setDate ao invés setObject?

Sasaki, consegui resolver!Além do setDate, tive que fazer isso depois do checkStringSizeData:

[code]
public static Date strToDate(String s){
SimpleDateFormat sdf1 = new SimpleDateFormat(“yyyy-MM-dd”);
java.sql.Date data = new Date(new java.util.Date().getTime());

 if(s!=null && !s.isEmpty()){
	 try {
		java.util.Date d = sdf1.parse(s);
		 sdf1.applyPattern("dd/MM/yyyy");
		 java.sql.Date dataFinal = new Date(d.getTime());  
		 return dataFinal;
	}catch (ParseException e){		
		e.printStackTrace();
	}		
	
 }
 return data;

}[/code]

Tá funcionando 100%!Valeu a ajuda!Uma pergunta:Como você faria se tivesse que receber a data da forma que eu recebi, formatar e inserir no Oracle?Achei muito trabalho para tão pouca coisa.

Bom, pra ser bem sincero não sei se faria puramente com JDBC, mas sendo assim, eu faria algo simples, transformaria em Date e mandaria persistir com o setDate.

[quote=PaulH]Faço assim:

 pstmt.setInt(1,checkIntegerSize(ds.getString("ID_REQ"),10));		
 pstmt.setObject(2,(checkStringSizeData(ds.getString("DATAVENDA").trim(),10)));
 pstmt.setObject(3,(checkStringSizeData(ds.getString("DATACOMPRA").trim(),10)));
...resto do código, e fechar pstmt e conexão

meu insert final static String query= “INSERT INTO MANUTENCAO(ID_REQ,DATAVENDA,DATACOMPRA) VALUES (?,?,?)”;
esse DS é o parser que eu pego os dados do arquivo texto.[/quote]

ta bom… você ainda está passando como parâmetro uma string, o retorno do seu método checkStringSizeData (ironicamente não foi só o Rodrigo que não tinha visto que voc~e não o tinha postado…hehe )

mas você não alterou para fazer do jeito certo como eu te orientei, se você vai inserir uma data nessa coluna na bse de dados, use o tipo correto para datas, ficar usando strings para isso pode dar problema, eu fui dar uma pesquisada e o melhor dos exemplos que encontrei direto em um site foi esse. como não achei que fosse dos mais didáticos, apesar de não ser ruim, suponha uma tabela pessoa, com nome, idade e data de nascimento, o código ficaria algo ± assim:

import java.util.Date;
import java.sql.*;

public class SuaClasseQueEncapsulaOperacoesNoBancoDeDados {

	public static void inserirPessoa(Pessoa pessoa) {

		Connection con = null;
		PreparedStatement pst = null;
		ResultSet rs = null;

		String url = "jdbc:mysql://<host, provavelmente no seu teste vai ser localhost>:<porta, <padrrao do mysql 3306>/";
		String db = "database";
		String driver = "com.mysql.jdbc.Driver";
		String user = "usuario";
		String pass = "senha";

		try {
			Class.forName(driver);
			con = DriverManager.getConnection(url + db, user, pass);
			con.setAutoCommit(false);

			String sql = "insert into pessoa(nome, idade, nascimento) values(?,?,?) ";
			pst = con.prepareStatement(sql);
			
			pst.setString(1, pessoa.getNome());//nome é de tipo String
			pst.setInt(2, pessoa.getIdade);//idade é do tipo int
			pst.setDate(3, new java.sql.Date(pessoa.getIdade.getTime()));
			//idade é de tipo java.util.Date, com ele você monta um java.sql.Date
			//se você quiser gaurdar hora minuto segundo usa java.sql.Timestamp ao invés de java.sql.Date

			int quantidadeLinhasAlteradas = pst.executeUpdate();
			
			String mensagem = "seu teste alteru "+quantidadeLinhasAlteradas+" linhas";
			System.out.println(mensagem);
			//LOG.debug(mensagem);
			
			con.commit();
		} catch (Exception e) {
			String mensagemErro = "ocorreu o seguinte erro ao inserir pessoa: "+e.getMessage();
			System.out.println(mensagemErro);
			e.printStackTrace();
			//LOG.error(memnsagemErro, e);
			
			con.rollback();
		} finally {
			if (rs != null)
				rs.close();
			if (pst != null)
				pst.close();
			if (con != null)
				con.close();
		}
	}
	
}

também achei esse exemplo mas ele é horrível, é um código mais completo mas não da commit ou rollback, não fecha os recursos no lugar certo, pessoalmente achei talvez possa ter sido feito com boas intenções mas acaba por ser um desserviço a comunidade.

aconselho fortemente que você pegue alguma apostila de java que tenha algum capitulo de jdbc, as mais recomentadas são a da caelum, iniciativa jedi, veja se a K19 também não tem alguma de java básico, jse, acho que tem…

Entendi maior_abandonado, mas você tem que levar em conta que meus dados são strings dentro do .txt que tem que serem tratadas antes depois eu converti para o Date e tudo funcionou ok.Meu código não é muito diferente do seu, exceto que eu uso executeBatch porque são muitas linhas.Valeu pelas dicas. :smiley: