Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Pytanie PreparedStatement w Javie przeciwko Oracle

Jestem trochę zaskoczony widząc ten dokument. Prawdą jest, że nie można ustawić tablicy/kolekcji w następujący sposób (i to niezależnie od użytego sterownika bazy danych / JDBC):

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

Ale wspomniane w dokumencie zapytanie powinno zadziałać. Mogę to stwierdzić na podstawie doświadczenia z co najmniej Oracle 10g XE w połączeniu z ojdbc14.jar . Podejrzewam, że albo autor dokumentu pomylił rzeczy, albo faktycznie dotyczy innej (starszej?) wersji sterownika DB i/lub JDBC.

Poniższe powinno działać niezależnie od używanego sterownika JDBC (chociaż jesteś zależny od używanej bazy danych, ile elementów może zawierać klauzula IN, Oracle (tak, znowu) ma limit około 1000 elementów):

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]);
    }
}

W odniesieniu do TIMESTAMP pytanie, po prostu użyj PreparedStatement#setTimestamp() .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ładowanie danych z pliku tekstowego do tabeli w Oracle

  2. ORA-28001:Hasło wygasło

  3. Jak zgłosić wyjątek w PL/SQL?

  4. Używanie TUPLES do umieszczania ponad 1000 wpisów w klauzuli SQL IN

  5. jak zrobić retrospekcję, gdy mamy ochronę danych