2013-01-28 4 views
0

Я использую Scriptella для миграции базы данных. Какой был бы лучший способ скопировать поле longblob из таблицы A в таблицу B?Копирование полей blob в Scriptella

Когда я делаю эту работу, как это:

<query ... 
    SELECT FL_DATA as data FROM A where FL_DATA IS NOT NULL 
    <script ...> 
    INSERT B (FL_DATA) VALUES ('$data'); 
    </script> 
</query> 

, то это будет просто написать «BLOB: java.io.IOException: слишком длинная, чтобы поместиться в памяти» в поле назначения (BTW: размер of longblob - всего несколько килобайт).

ответ

0

Когда используется $ variable синтаксис, текстовое значение переменной просто вставляется в текст инструкции. Рекомендуемый подход заключается в использовании синтаксиса подготовленных операторов. В этом случае значения будут передаваться отдельно от оператора SQL. Пожалуйста, попробуйте следующее:

<query ... 
    SELECT FL_DATA as data FROM A where FL_DATA IS NOT NULL 
    <script ...> 
    INSERT B (FL_DATA) VALUES (?data); 
    </script> 
</query> 
0

К сожалению, это не ответ, но я не знаю, как комментировать ответ ejboy в.

Ejboy, это не работает для меня. Я пробовал подготовить заявление с (в моем случае)? Описание и? 2. Та же ошибка, я получаю, когда я пытаюсь показать содержимое на консоли:

<query connection-id="database"> 
    SELECT id, description FROM table; 
    <script connection-id="copy_database"> 
     INSERT INTO table VALUES (?1, ?2); 
    </script> 
    <script connection-id="text"> 
     $id, $description 
    </script> 
</query> 

я получаю ту же ошибку для обоих, для отображения и вставки (здесь пример для показа):

BRA0735401, CLOB: java.io.IOException: Content too long to fit in memory 

Мои главная задача сделать копию из одной базы данных в другую. Как и в случае с Jan, содержимое blob/clob составляет около 40 kB (список ключей/значений, каждый в отдельной строке, из точки базы данных это MySQL MEDIUMTEXT). Я знаю, что можно вставить blob/clob из файла (пример скриптеллы с mp3-файлами), и можно записать содержимое блоба в файл (пример сценариста с odbc и изображениями с janino), поэтому я попытаюсь использовать решение с временным файлом, но это не прекрасное решение. Я прав?

Есть ли более простое решение?

С уважением, Яцек

+0

ошибка выводится, если сообщение превышает 10Мб, пожалуйста, проверьте, какие данные вы вывода. Самое простое решение - не выводить содержимое BLOB на консоль. В качестве альтернативы вы можете обрезать описание с помощью substr или другой функции SQL, например. 'SELECT ID, DESCRIPTION, SUBSTR (ОПИСАНИЕ, 1, 100) как SHORT_DESC FROM ...' и распечатать его с помощью $ SHORT_DESC – ejboy

+0

Я думаю, проблема связана с методом scriptella.jdbc.Lobs.ReadonlyClob.toString(). Этот метод описан как «Для целей отладки», но используется в scriptella. Я удалил в этом методе строку «CLOB:» в начале и второй параметр «1024» вызова IOUtils.toString, и теперь все работает отлично !. – user1337302

+0

Я создал [билет] (http://javaforge.com/issue/54430), чтобы отслеживать эту проблему. Но в любом случае я советую не использовать BLOB или CLOB поля в $ выражениях. Это может ухудшить производительность или вызвать OutOfMemoryErrors для больших наборов данных. – ejboy

Смежные вопросы