| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Oracle > черти чего в JDBC (Оракл) |
| Автор: Sleepy_PIP 30.10.2005, 18:55 | ||||
короче вот так:
где: ResultSet rr, OraclePreparedStatement insS=(OraclePreparedStatement)cc.connORA.prepareStatement(insSQL); на insS.executeQuery() получаем ошибку: java.sql.SQLException: ORA-24813: нельзя отправить или получить неподдерживаемый LOB при попытке записать боолее 4000 байт. (а может и не в этом дело??) Граница - общеизвестная, да. объявление таблицы в интересующем поле:
уже понимаю что есть ограничения в 4к, что храняться в основной таблице. как это обойти? |
| Автор: LSD 30.10.2005, 19:18 |
| Где выполняется данный код, внутри сервера Oracle или на клиенте? Когда код выполняется внутри сервера Oracle используется другой JDBC драйвер, который не позволяет получать blob в виде byte[] если он по размеру больше 4К. Приходилось использовать Blob.getBinaryStream(). P.S. В доке также написанно, что данная ошибка может возникать если используются разные версии сервера и клиента, ты проверял версии совпадают? |
| Автор: Sleepy_PIP 30.10.2005, 19:33 | ||
на клиенте. счаз попробую через стиримы. хотя ошибка говорит о не соместимости клинта и сервера. однако клиент от 9.1.2 и сервер тот-же. ... |
| Автор: LSD 30.10.2005, 23:39 | ||||
|
| Автор: Sleepy_PIP 31.10.2005, 04:48 | ||||||||||
сделал так:
ошибки не возникает, но ничего в блоб не пишется (а данные - есть - во входном ResultSet'е rr). А как проверить версию клиента? У меня все стоит локально - и прогрмака и сервер на одной машинке. Сервер у меня 9.2.0.1.0 . отдельно никакого клиента не ставил, но ранее тут-же стоял Oracle8i, так что возможно клиент и не тот. Как проверить какой клиент актуален? и еще: сейсчаз я пытаюсь работать с полями типа BLOB, а ранее работал с полем LONG RAW таким куском кода:
и все было прекрасно. но теперь мне нужны _именно_ blob ... Спасибо! PS: да, я делаю вставку - т.е. insS - это инсертный стейтмент |
| Автор: Sleepy_PIP 31.10.2005, 05:34 | ||
YES!!! заработало вот как:
теперь остается проверить целостность данных подозреваю что это как-бы так по мягче сказать - не совсем правильный подход Подскажите как тогда правильно делать, а? Спасибо! PS: а с блобом таким временным чего делать еще надо после завершения стейтмента? а то вдруг они в коннекте копятся, а? (в доке не сказано ничего). |
| Автор: LSD 31.10.2005, 10:52 | ||
По идее он должен освобождаться по окончании вызова, но для надежности можешь его очистить BLOB.freeTemporary(). |
| Автор: Sleepy_PIP 1.11.2005, 11:24 | ||||||
Да. экспериментально подтверждена необходимость освобождения БЛОБов после каждого выполнения стейтмента. Иначе рано или позно переполняется shared pool. Но все оказалось еще интереснее. В качестве тестовых данных использовались читабельные строки. (ну разумеется байтовое их представление). Так вот - при приведенном способе при последующем контрольном чтении после коммита вставки в БЛОБах оказывалась нужная строка, предваренная 44 символами 0x20 (пробел) с начала. почем так - не ведаю. В результате перешел как и советовал LSD на стримовый подход. теперь правильная вставка (заполение) блоба выглядит так:
контролькое чтение подтверждает что в БД именно то, что заносилось. Такие вот дела. |