Столкулся с тем, что данная конструкция подстановки параметра (:1) работает с драйвером Oracle:
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
try (Connection con =
DriverManager.getConnection("HOST", "USER", "PASS")) {
try (PreparedStatement preparedStatement =
con.prepareStatement("select * from TABLE where name = :1")) {
preparedStatement.setString(1, "NAME");
try (ResultSet resultSet = preparedStatement.executeQuery()) {
while (resultSet.next()) {
System.out.println(resultSet.getObject(1));
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
В JSR указано использование только знака ?.
Это особенность реализации драйвера?
UPD:
Версия БД:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production
Что замечено еще:
try (PreparedStatement preparedStatement =
con.prepareStatement("select * from TABLE where name = :abc and id = :dcf")) {
preparedStatement.setString(1, "PARAM");
preparedStatement.setInt(2, 173);
try (ResultSet resultSet = preparedStatement.executeQuery()) {
while (resultSet.next()) {
System.out.println(resultSet.getObject(1));
}
}
}
просьба обратить внимание на название подстановок, этот код работает.
А вот этот уже не работает:
try (PreparedStatement preparedStatement =
con.prepareStatement("select * from TABLE where name = :abc and id = :dcf")) {
preparedStatement.setString(2, "NAME");
preparedStatement.setInt(1, 173);
try (ResultSet resultSet = preparedStatement.executeQuery()) {
while (resultSet.next()) {
System.out.println(resultSet.getObject(1));
}
}
}
java.sql.SQLSyntaxErrorException: ORA-01722: неверное число
То есть на название вообще нет реакции, только на ":" порядок.
Как упомянуто в оф. документации гл. Binding by name
This capability to bind by name using the setXXX methods is not part of the JDBC specification, and Oracle does not support it.
Oracle не поддерживает подстановку по имени при использовании метода, как в вопросе, setString(). Однако:
Under certain circumstances, previous versions of Oracle JDBC drivers have allowed binding statement variables by name when using the setXXX methods.
не исключается, что такое было возможно в старых драйверах (в какой иммено версии не указано, см. ссылку выше).
В примере показанном в вопросе, скорее всего, как раз этот случай, т.к. вызов:
Class.forName("oracle.jdbc.driver.OracleDriver");
устарел и начиная с JDBC версии 4.0 не должен больше использоваться (подробнее см. тут).
Сборка персонального компьютера от Artline: умный выбор для современных пользователей