Подстановка параметра PreparedStatement в JDBC Oracle

203
27 апреля 2018, 15:27

Столкулся с тем, что данная конструкция подстановки параметра (: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: неверное число

То есть на название вообще нет реакции, только на ":" порядок.

Answer 1

Как упомянуто в оф. документации гл. 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 не должен больше использоваться (подробнее см. тут).

READ ALSO
Ограничение рерусров контейнера на aws ecs (Ошибка “Java heap space” при сортировке)

Ограничение рерусров контейнера на aws ecs (Ошибка “Java heap space” при сортировке)

Разворачиваю на AWS ECS контейнеры и пробую настроить оптимальную структуруДля тестирования запустил контейнер с сортировкой на 45млн элементов...

179
Уроки по Spring

Уроки по Spring

Посоветуйте хорошую литературу или видеоуроки по Spring Boot для расширенного изучения на русском языкеПодробно объясняющую книгу

195
Как поместить кнопку меню в панель кнопок если нет хардварной кнопки меню?

Как поместить кнопку меню в панель кнопок если нет хардварной кнопки меню?

У меня имеется ToolBar и кнопка меню на нем, но помимо меню он не выполняет никакой ролиКак поместить кнопку меню в строку управляющих кнопок?...

186