Oracle

Тема в разделе "Lotus + Java + LS2J", создана пользователем NickProstoNick, 14 мар 2016.

  1. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Теряю веру в жизнь :(

    Есть агент, который инсертит данные в базу Oracle.
    В запросе 32 параметра. Заполняются через PreparedStatement.
    Инсерт происходит через executeBatch();
    В итоге получаю ошибку:
    Но что самое интересное - данные, которые я пытаюсь вставить в это поле, меньше 30.
    Подскажите, как просмотреть SQL-запрос, который образовался после подготовки?
    Мне кажется, что проблема именно в нем.

    Такой вариант не работает. Ппринтует только указатель
    Код (Java):
    System.out.println(preparedStatement);
     
    #1 NickProstoNick, 14 мар 2016
    Последнее редактирование модератором: 14 мар 2016
  2. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    770
    Симпатии:
    50
    Spring JDBC умеет это. Но у оракловых драйверов есть свои встроенные средства логирования (не пробовал) Diagnosability in JDBC, только драйвера надо с буквой _g использовать.
    1. Разница в видимом вами количестве символов и реально вставляемым в базу может быть из-за разных кодировок.
    2. Убедитесь, что "вставляете" в ту схему, структуру таблицы которой вы смотрите, не полагайтесь на схему по-умолчанию, укажие её явно.
    3. Ну, и в конце-концов есть же отладка "по-шагам" (в какой-нибудь Java IDE). Посмотрите что у ваc там вставляется в это поле.
     
  3. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    1. Кодировка приведена к UTF-8 как и сама таблица. Строку в байтах привожу к допустимой длине поля (-2 байта для хеша).
    Так что в принципе такой ошибки быть не должно.
    2. таблица та.
    3. с отладкой проблема :( Пытаюсь решить, но пока никак
     
  4. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
  5. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
  6. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    770
    Симпатии:
    50
    Код (Text):
    SELECT * FROM nls_database_parameters;
    что говорит?
    Не таблица, а схема. В другой схеме может быть таблица с таким же именем.
    А какие трудности?
     
  7. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    этот вопрос снят.
    Тяжело быть бестолковым. Спутал индексы параметров запроса.

    Но появился другой вопрос. Необходимо по индексу определить имя параметра.
    Запрос следующего вида
    Код (Text):
    INSERT INTO table( fld1, fld2, fld3 )
    VALUES ( ?, ?, ?)
    Пробовал так :
    Код (Java):
    ParameterMetaData paramMetaData = queryOra.getParameterMetaData();
    String paramTypeName = paramMetaData.getParameterTypeName(1);
    Но безрезультатно :(
    Хотя paramMetaData в принципе есть. Количество параметров получить можно
     
    #7 NickProstoNick, 14 мар 2016
    Последнее редактирование модератором: 14 мар 2016
  8. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    770
    Симпатии:
    50
    Не могу придумать зачем это может понадобиться.
    Но может быть тогда уже сразу перейти к именованным параметрам?
    Код (Text):
    ps = conn.prepareStatement("select * from tab where id = :id");
    ((OraclePreparedStatement)ps).setIntByName("id", 42);
    или опять же Spring
    NamedParameterJdbcTemplate
     
    #8 garrick, 15 мар 2016
    Последнее редактирование модератором: 15 мар 2016
  9. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    770
    Симпатии:
    50
    тут есть примерчик
    Get Parameter Type Name
     
  10. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Могу сказать. Очень удобно, когда запросы пишет кто-то другой.
    При обращении по индексу поля должны мапиться в определенном порядке. Иначе будет как у меня :)
    Спутал порядок - получил ошибку.
    Да я собвственно и не против обращаться по индексу, но мне нужно знать имя параметра
     
  11. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    770
    Симпатии:
    50
    Код (Text):
    ParameterMetaData
    Возвращает только тип параметра, например INTEGER, VARCHAR & etc., но не имя столбца.
     
  12. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    в общем разобрался.
    Пришлось писать парсер и параметры в запросе указывать в виде
    Код (Text):
    :<имя параметра>
     
  13. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    770
    Симпатии:
    50
    А на паркуа? Чем Spring JDBC Template не устроило? Там уже это есть готовое + много ещё чего интересного. К тому же, как я уже указывал выше, в оракловом JDBC драйвере уже есть методы setXXXAtName()*. Например:
    Код (Text):
    void setStringAtName(String parameterName,
                         String value)
                         throws SQLException
    Код (Text):
    OraclePreparedStatement ps = conn.prepareStatement("select * from tab where name = :name");
    ps.setStringAtName("name", "Bob");
    * - XXX - это Int, String, Date & etc.
     
    #13 garrick, 16 мар 2016
    Последнее редактирование модератором: 16 мар 2016
    2 пользователям это понравилось.
  14. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    хм... что-то я пропустил...
     
  15. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    спасибо! ОНО!
    Похоже заработался я :(
     
Загрузка...

Поделиться этой страницей