sql >> Databasteknik >  >> RDS >> Oracle

PreparedStatement-fråga i Java mot Oracle

Jag är lite förvånad över att se detta dokument. Det är sant att du inte kan ställa in en array/samling som följer (och detta är oavsett vilken databas/JDBC-drivrutin som används):

String sql = "SELECT col FROM tbl WHERE id IN (?)";
statement = connection.prepareStatement(sql);
statement.setArray(1, arrayOfValues); // Fail.

Men den i dokumentet nämnda frågan borde fungera. Jag kan säga detta av erfarenhet med åtminstone Oracle 10g XE i kombination med ojdbc14.jar . Jag misstänker att antingen författaren till dokumentet blandade ihop saker, eller så rör det faktiskt en annan (äldre?) version av DB- och/eller JDBC-drivrutinen.

Följande borde fungera oavsett vilken JDBC-drivrutin som används (även om du är beroende av DB:n hur många objekt IN-satsen kan innehålla, har Oracle (ja, igen) en gräns på cirka 1000 objekt):

private static final String SQL_FIND = "SELECT id, name, value FROM data WHERE id IN (%s)";

public List<Data> find(Set<Long> ids) throws SQLException {
    Connection connection = null;
    PreparedStatement statement = null;
    ResultSet resultSet = null;
    List<Data> list = new ArrayList<Data>();
    String sql = String.format(SQL_FIND, preparePlaceHolders(ids.size()));

    try{
        connection = database.getConnection();
        statement = connection.prepareStatement(sql);
        setValues(statement, ids.toArray());
        resultSet = statement.executeQuery();
        while (resultSet.next()) {
            Data data = new Data();
            data.setId(resultSet.getLong("id"));
            data.setName(resultSet.getString("name"));
            data.setValue(resultSet.getInt("value"));
            list.add(data);
        }
    } finally {
        close(connection, statement, resultSet);
    }

    return list;
}

public static String preparePlaceHolders(int length) {
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < length;) {
        builder.append("?");
        if (++i < length) {
            builder.append(",");
        }
    }
    return builder.toString();
}

public static void setValues(PreparedStatement preparedStatement, Object... values) throws SQLException {
    for (int i = 0; i < values.length; i++) {
        preparedStatement.setObject(i + 1, values[i]);
    }
}

Med hänsyn till TIMESTAMP fråga, använd bara PreparedStatement#setTimestamp() .



  1. Lägg till IIS 7 AppPool-identiteter som SQL Server-inloggningar

  2. Jämföra objekt efter värde. Del 6:Struktur Jämställdhetsimplementering

  3. Förstå de 3 nyckelegenskaperna hos Big Data

  4. FEL:kunde inte komma åt filen "$libdir/plpython2" - FEL:kunde inte komma åt filen "$libdir/plpython3"