Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ORA-00904数据存在时出错_Java_Oracle_Jdbc - Fatal编程技术网

Java ORA-00904数据存在时出错

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

我使用下面的代码检查代码是否存在,如果没有相同的代码,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;
}

您似乎对如何在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"));
    }
}