Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Pertanyaan ReadyStatement di Jawa melawan Oracle

Saya agak terkejut melihat dokumen ini. Memang benar bahwa Anda tidak dapat mengatur array/koleksi seperti berikut (dan ini terlepas dari database / driver JDBC yang digunakan):

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

Tetapi permintaan dalam dokumen yang disebutkan seharusnya berfungsi. Saya dapat mengetahui ini dari pengalaman dengan setidaknya Oracle 10g XE dalam kombinasi dengan ojdbc14.jar . Saya menduga bahwa baik pembuat dokumen bingung, atau sebenarnya menyangkut versi (lama?) dari driver DB dan/atau JDBC yang berbeda.

Yang berikut ini harus berfungsi terlepas dari driver JDBC yang digunakan (walaupun Anda bergantung pada DB yang digunakan berapa banyak item yang dapat berisi klausa IN, Oracle (ya, sekali lagi) memiliki batas sekitar 1000 item):

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

Sehubungan dengan TIMESTAMP pertanyaan, cukup gunakan 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. Pengenalan Paket PL/SQL Di Database Oracle

  2. Cara mengaktifkan jejak di aplikasi oracle r12

  3. Kueri dua tabel dari skema yang berbeda

  4. Bagaimana cara mempercantik output yang berasal dari kueri SELECT di command prompt?

  5. Oracle Cari semua tabel semua kolom untuk string