Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Câu hỏi PreparedStatement trong Java chống lại Oracle

Tôi hơi ngạc nhiên khi xem tài liệu này. Đúng là bạn không thể đặt một mảng / bộ sưu tập như sau (và điều này không phụ thuộc vào cơ sở dữ liệu / trình điều khiển JDBC được sử dụng):

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

Nhưng truy vấn trong tài liệu được đề cập phải hoạt động. Tôi có thể nói điều này từ kinh nghiệm với ít nhất Oracle 10g XE kết hợp với ojdbc14.jar . Tôi nghi ngờ rằng tác giả của tài liệu đã nhầm lẫn mọi thứ hoặc nó thực sự liên quan đến một phiên bản khác (cũ hơn?) Của trình điều khiển DB và / hoặc JDBC.

Phần sau sẽ hoạt động bất kể trình điều khiển JDBC được sử dụng (mặc dù bạn phụ thuộc vào DB đã sử dụng bao nhiêu mục mà mệnh đề IN có thể chứa, Oracle (vâng, một lần nữa) có giới hạn khoảng 1000 mục):

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

Liên quan đến TIMESTAMP câu hỏi, chỉ cần sử dụng 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. postgreSQL mysql oracle khác biệt

  2. Có loại tem thời gian sửa đổi tự động cho các cột Oracle không?

  3. Cách cập nhật với tham gia bên trong trong Oracle

  4. khóa ngoại có luôn tham chiếu đến khóa duy nhất trong bảng khác không?

  5. làm thế nào để sử dụng xmltable trong oracle?