sql >> データベース >  >> RDS >> Oracle

Oracleに対するJavaのPreparedStatementの質問

    このドキュメントを見て少し驚いています。確かに、次のように配列/コレクションを設定することはできません(これは、使用するデータベース/ JDBCドライバーに関係ありません):

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

    しかし、言及されたドキュメントのクエリは機能するはずです。これは、少なくともOracle10gXEとojdbc14.jarを組み合わせた経験からわかります。 。ドキュメントの作成者が混乱しているか、実際には別の(古い?)バージョンのDBやJDBCドライバーに関係しているのではないかと思います。

    以下は、使用されるJDBCドライバーに関係なく機能するはずです(IN句に含めることができるアイテムの数を使用するDBに依存しますが、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. SQL ServerのテーブルからXML値と属性をクエリする方法は?

    2. SequelizeORMの結合テーブルの条件

    3. PostgreSQLDBの現在の接続数を取得するための正しいクエリ

    4. DBNullに対処するための最良の方法は何ですか