ORA-01722 número inválido

Olá,

Estou com a seguinte situação, quero fazer uma consulta, onde posso informar tanto o nome do funcionário ou sua matricula, numa tela bem simples, conforme abaixo:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
    try {
        Connection con = DriverManager.getConnection("jdbc:oracle:thin:@//locahost/teste","admin","admin");
        String sql = "SELECT matricula, nome FROM funcionario";
        if(!txNome.getText().equals(""))
            sql = sql + " where nome LIKE ? OR matricula = ? ";
        PreparedStatement stmt = con.prepareStatement(sql);
        if(!txNome.getText().equals(""))
            stmt.setString(1,"%"+txNome.getText()+"%");
            stmt.setString(2,txNome.getText());
        ResultSet rs = stmt.executeQuery();
        DefaultTableModel model = (DefaultTableModel) jtColaborador.getModel();
        model.setNumRows(0);
        while(rs.next()){
            String[] linha = {rs.getString("matricula"), rs.getString("nome") };
            model.addRow(linha);
        }
        
        stmt.close();
        con.close();
    } catch (SQLException e) {
        JOptionPane.showMessageDialog(this, e);
    }
}                 

Estou conseguindo consultar pela matricula, porém ao tentar informar o nome, acontece o erro abaixo:

2021-01-26_17h41_15

Poderiam me ajudar?

Obrigado.

Se matricula é uma coluna numérica, você não pode comparar com valor textual.

Poderia me ajudar a contornar isso?

Passei ontem a tarde toda pensando em formas de fazer diferente, mas não consegui, foi ai que resolvi pedir ajuda.

Como podes ver, sou iniciante.

Obrigado.

Primeiro verifica se o conteúdo do JTextField é numérico.
se for numérico, você faz a query com where nome LIKE ?.
se não for numérico, você faz a query com where matricula = ?.

No JTextField eu posso informar tanto o nome que é um texto, quanto a matricula que é numérico.

Via SQL eu consigo fazer a consulta usando o “OR” para pelo menos atender uma das duas condições.

Porém no java não estou conseguindo, existe alguma tratativa?

Se eu mudo apenas para uma condição.

sql = sql + " where NOMFUN LIKE ? ";

ou

sql = sql + " where NUMCAD = ? ";

Eu consigo fazer a consulta tanto via matricula ou nome, mas com apenas uma das duas condições.

Queria ter a opção de pesquisar pela matricula ou pelo nome do cara no mesmo textField

Assim deve dar

sql = sql + " where nome LIKE ? OR to_char(matricula) = ? ";
1 curtida
String texto = txNome.getText();
String sql = "SELECT matricula, nome FROM funcionario";
if(!"".equals(texto)) {
    if (texto.matches("\\d+")) {        // é um valor numérico?
        sql += " where matricula = ? "; // sim, faz o where com a matricula
    } else {
        sql += " where nome LIKE ? ";   // não, faz o where com o nome
    }
}
1 curtida

Obrigado, deu certo.

Muito obrigado pela ajuda.