Столкулся с тем, что данная конструкция подстановки параметра (: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 не должен больше использоваться (подробнее см. тут).
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Разворачиваю на AWS ECS контейнеры и пробую настроить оптимальную структуруДля тестирования запустил контейнер с сортировкой на 45млн элементов...
Посоветуйте хорошую литературу или видеоуроки по Spring Boot для расширенного изучения на русском языкеПодробно объясняющую книгу
У меня имеется ToolBar и кнопка меню на нем, но помимо меню он не выполняет никакой ролиКак поместить кнопку меню в строку управляющих кнопок?...