Java ORA-00904数据存在时出错
我使用下面的代码检查代码是否存在,如果没有相同的代码,executeQuery()没有任何问题Java ORA-00904数据存在时出错,java,oracle,jdbc,Java,Oracle,Jdbc,我使用下面的代码检查代码是否存在,如果没有相同的代码,executeQuery()没有任何问题 public boolean isExist(String code) throws DataBaseException { boolean isExist = false; StringBuffer querySql = new StringBuffer(); querySql.append(" SELECT "); querySql.append(" MY_COD
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;
}
您似乎对如何在JDBC中使用prepared语句感到困惑,尽管您尝试使用prepared语句肯定是正确的。您应该使用以下模式:
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
}
您似乎将自己的类用于
PreparedStatement
:
super.setQuerySql(querySql.toString());
super.addParameter(Types.VARCHAR, code);
List<Object> resultsList = super.executeQuery();
它没有设置参数
但由于你没有表现出来,要给出一个更具体的答案并不容易
无论如何,不要试图重新发明那些有用的东西。使用执行作业的PreparedStatement
如果真的有用,您可以使用包含它的包装类,但基本上依赖它来执行查询并利用它们的结果。我找到了错误的原因,因为我的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"));
}
}
您的超类显然没有正确处理参数,因为它实际上执行了查询
从MY\u MST中选择MY\u code,其中MY\u code=?
。super.addParameter是NG?但是当我用同样的方法插入时,没有任何问题……我不知道NG是什么意思。如果需要帮助,请发布相关代码。
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"));
}
}