Duvida de como substituir em prepareStatement

Folks,

porque me dá erro na hora de substituir a data no comando SQL.
na linha pst.setString(2, dataEmissao);

se alguém puder me ajudar …agradeceria…

abs

erro:
leNotaFiscalCancelada =java.sql.SQLException: ORA-01006: a variável de ligação não existe
public NFe leCancelada (long notaFiscal,String dataEmissao) throws SQLException{
     Connection conn = ServiceLocator.getInstance().getConnection();;
			ResultSet rs = null;
			ResultSet rs1 = null;
			PreparedStatement pst =null;
			StringBuilder sql = new StringBuilder("");
			
			sql= leSQL("notaCancelada");
			
			pst = conn.prepareStatement(sql.toString());
			pst.setLong(1, notaFiscal);
			pst.setString(2, dataEmissao);
			rs  = pst.executeQuery();
			
--metodo

private StringBuilder leSQL(String chave){

if (chave.equals("notaCancelada")){
			
			sql.append("\n  select '55' mod , ");
			sql.append("\n         nvl(nota.NR_SERIE_NF,'1')   serie  ,  ");
			sql.append("\n         nota.NR_NF nNF  ,   ");
			sql.append("\n         to_char(nota.DT_EMISSAO,'YYYY-MM-DD') dEmi,  ");
			sql.append("\n         filialemit.nr_cnpj     CNPJ ,  ");
			sql.append("\n         nvl(geral.SG_ESTADO,';;') UF   ");
			sql.append("\n  from        xxx,  ");
			sql.append("\n              yyy ,  ");
			sql.append("\n              kkk geral, ");
			sql.append("\n              tbbbb  nf_comple_unica ");
			sql.append("\n  where  nota.CD_TRANSACAO_CLIENTE =18 --TRANSF. MERC. DEPOSITO/FILIAL");
			sql.append("\n  and    nota.CD_FILIAL = filialemit.CD_FILIAL");
			sql.append("\n  and    geral.CD_FILIAL = nota.CD_FILIAL");
			sql.append("\n  and    nf_comple_unica.ID_NF = nota.ID_NF");
			sql.append("\n  and    nota.nr_nf = ?");
			sql.append("\n  and    nota.dt_emissao = to_date('?','ddmmyyyy')");
			sql.append("\n  and    nf_comple_unica.FL_CANCELADO =1");
		}

O problema é que ao fazer:

  sql.append("\n  and    nota.dt_emissao = to_date('?','ddmmyyyy')"); 

Você não está criando um parâmetro. O oracle entende que o ‘?’ é uma literal. O que você vai ter que fazer é mudar para:

  sql.append("\n  and    nota.dt_emissao = ?");

E passar o parâmetro dataEmissao da sua função para Date:

  pst.setDate(2, dataEmissao);//O parâmetro dataEmissao tem que ser Date, não String  

Abrs,

mas meu metodo recebe uma String o atributo dataEmissao

por isso estou usando to_date

para converter de String para date …

não tem outro jeito de usar String para date como está ???

Dá não… O que você pode fazer é converter de String para Date na hora de passar o parâmetro, tipo assim:

		String mask = "yyyy-MM-dd";
		SimpleDateFormat formatter = new SimpleDateFormat(mask);
		try {
			pst.setDate(2, formatter.parse(dataEmissao));  
		} catch (ParseException e) {
			e.printStackTrace();
		};

Caro,

tentei o que você passou mas deu erro :

Erro  =java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date



	public NFe Cancelada (long notaFiscal,String dataEmissao) throws SQLException{
		NFe n = null;
		try {
			Connection conn = ServiceLocator.getInstance().getConnection();;
			ResultSet rs = null;
			PreparedStatement pst =null;
			StringBuilder sql = new StringBuilder("");
			SimpleDateFormat formatter = new SimpleDateFormat("ddMMyyyy");
			sql= leSQL("notaCancelada");
			pst = conn.prepareStatement(sql.toString());
			pst.setLong(1, notaFiscal);
			pst.setDate(2, (Date) formatter.parse(dataEmissao) );
			rs  = pst.executeQuery();
			while(rs.next()){

O método parse da classe SimpleDateFormat retorna um objeto do tipo java.util.Date, e vc está tentando dar um cast para java.sql.Date.

O que vc pode fazer é:

 pst.setDate(2, new java.sql.Date( formatter.parse(dataEmissao).getTime() ) );

[]'s

Obrigado pelo retorno era isso mesmo !!!

Valeu …

abs