Oracle
 sql >> база данни >  >> RDS >> Oracle

PreparedStatement въпрос в Java срещу Oracle

Малко съм изненадан да видя този документ. Вярно е, че не можете да зададете масив/колекция, както следва (и това е независимо от използваната база данни / JDBC драйвер):

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

Но заявката, спомената в документа, трябва да работи. Мога да кажа това от опит с поне Oracle 10g XE в комбинация с ojdbc14.jar . Подозирам, че или авторът на документа е объркал нещата, или всъщност се отнася до различна (по-стара?) версия на DB и/или JDBC драйвер.

Следното трябва да работи независимо от използвания JDBC драйвер (въпреки че сте зависими от използваната DB колко елемента може да съдържа IN клаузата, Oracle (да, отново) има ограничение от около 1000 елемента):

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

По отношение на TIMESTAMP въпрос, просто използвайте 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. Пример за функция на Oracle (Номер за връщане)

  2. .NET / Oracle:Как да изпълним скрипт с DDL изрази програмно

  3. Не може да се компилира GI 12.1.0.2 и грешка при сегментиране

  4. Изберете последния ред за всяка група от oracle

  5. V$SQL_SHARED_CURSOR TOP_LEVEL_RPI_CURSOR