存在数据时出现ORA-00904错误

时间:2017-05-30 05:54:53

标签: java oracle jdbc

我使用下面的代码检查代码是否存在,如果没有相同的代码,executeQuery()没有任何问题。

public boolean isExist(String code) throws DataBaseException {
    boolean isExist = false;

    StringBuffer querySql = new StringBuffer();
    querySql.append(" SELECT ");
    querySql.append(" MY_CODE ");
    querySql.append(" FROM ");
    querySql.append(" MY_MST ");
    querySql.append(" WHERE ");
    querySql.append(" MY_CODE = ? ");

    try {
        super.setQuerySql(querySql.toString());
        super.addParameter(Types.VARCHAR, code);
        List<Object> resultsList = super.executeQuery();

        if (resultsList != null && resultsList.size() > 0) {
            isPsiExist = true;
        }
    } catch (Exception e) {
        throw new DataBaseException(e, "Can't get the code.", this.getClass().getName(), querySql.toString());
    }

    return isExist;
}

但如果代码存在,那么ORA-00904就发生了,有人告诉我为什么吗?我该如何解决这个问题?

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [ SELECT  MY_CODE  FROM  MY_MST  WHERE  MY_CODE = ? ]; nested exception is java.sql.SQLException: invalid identifier.

3 个答案:

答案 0 :(得分:0)

您似乎对如何在JDBC中使用预准备语句感到困惑,尽管您尝试使用预准备语句肯定是在正确的轨道上。您应该使用以下模式:

String sql = "SELECT CODE FROM MY_MST WHERE CODE = ?";
try {
    PreparedStatement ps = dbConnection.prepareStatement(sql);
    ps.setString(1, code);
    ResultSet rs = ps.executeQuery();
    while (rs.next()) {
       // process the current row
    }
}
catch (SQLException e) {
    // handle exception
}

答案 1 :(得分:0)

您似乎将自己的班级用于PreparedStatement

super.setQuerySql(querySql.toString());
super.addParameter(Types.VARCHAR, code);
List<Object> resultsList = super.executeQuery();

问题是

super.addParameter(Types.VARCHAR, code); 

它没有设置参数。

但是,由于你没有表现出来,要提供更具体的答案并不容易。

无论如何,不​​要试图重新发明有效的东西。使用完成工作的PreparedStatement
如果真的很有用,你可以使用一个包含它的包装类,但主要依赖它来进行查询并利用它们的结果。

答案 2 :(得分:0)

我找到了错误原因,因为我的mapRow方法使用了多个列,很抱歉给您带来麻烦。

protected Object mapRow(ResultSet resultSet, int rowNumber) throws SQLException {
    ...
    psi.setCode(resultSet.getString("MY_CODE"));
    psi.setName(resultSet.getString("NAME"));
    ...
}

现在我修改后就可以了

protected Object mapRow(ResultSet resultSet, int rowNumber) throws SQLException {
    ...
    ResultSetMetaData rsmd = resultSet.getMetaData();
    int count = rsmd.getColumnCount();

    if (count == 1) {
        psi.setCode(resultSet.getString("MY_CODE"));
    }
    else {
        psi.setCode(resultSet.getString("MY_CODE"));
        psi.setName(resultSet.getString("NAME"));
    }
}