Как использовать свойство fixedString драйвера jdbc Oracle? - PullRequest
4 голосов
/ 26 марта 2009

Oracle дополняет значения в столбцах char, поэтому, если я вставлю «a» в столбец CHAR (2), я не смогу получить эту запись, сравнив этот столбец с «a», я должен получить ее, сравнив ее с «a». Правильно?

Для решения этой проблемы драйвер Oracle jdbc имеет свойство fixedString, но я не могу заставить его работать. (ищите fixedString здесь )

Я использую драйвер ojdbc14.jar для Oracle 10gR2 и обращаюсь к базе данных Oracle 10gR2.

Это мой код:

    try {
        Properties props = new Properties();
        props.put("user", "****");
        props.put("password", "****");
        props.put("fixedString", true);

        Class.forName("oracle.jdbc.driver.OracleDriver");

        String jdbcUrl = "jdbc:oracle:thin:@<host>:<port>:<sid>";

        Connection connection = DriverManager.getConnection(jdbcUrl, props);

        PreparedStatement ps = connection.prepareStatement(
                           "SELECT * FROM MY_TABLE WHERE MY_TABLE_ID = ?");
        ps.setObject(1, "abc"); // (*)
        // MY_TABLE_ID is CHAR(15)

        ResultSet rs = ps.executeQuery();
        while (rs.next())
        {
            System.out.print("data: ");
            System.out.println(rs.getString("MY_TABLE_ID"));
        }
        rs.close();
        ps.close();
        connection.close();
    } catch (SQLException ex) {
        ex.printStackTrace();
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    }

Приведенный выше код выполняется нормально (без исключений), но ResultSet пуст после выполнения executeQuery ().

Если я изменю строку (*) на

ps.setObject(1, "abc            ");

Тогда я получаю столбец, который хотел. Похоже, что драйвер игнорирует параметр fixedString.

Я также пытался изменить строку (*) для

ps.setObject(1, "abc", java.sql.Types.CHAR);

Но полученный ResultSet снова пуст. Чего мне не хватает?

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 27 августа 2009

Попробуйте использовать его как

props.put("fixedString", "true");

В документации Oracle указано fixedString как String (содержит логическое значение)

1 голос
/ 26 марта 2009

Документы оракула действительно приводят в бешенство. Я никогда не слышал об этом до вашего вопроса (одна из вещей, которые мне нравятся на этом сайте). изучил это и нашел несколько ссылок, в которых упоминается, что он будет использовать семантику "FIXED CHAR", но ничего, что описывает их работу или ожидаемые возвращаемые значения, только поведение в отношении соответствия и равенства. Можете ли вы сделать свой запрос, используя «Нравится»? (намного медленнее, конечно) Выключить фиксированную семантику символов для этого запроса? Вставить усеченные значения только в БД?

ссылки здесь , здесь , здесь .

1 голос
/ 26 марта 2009

Вы должны использовать CHAR только для строк одинаковой длины для каждой записи в базе данных. Используйте VARCHAR для строк переменной длины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...