我正在使用Scriptella进行数据库迁移。将长blob字段从表A复制到表B的最佳方法是什么?
当我像这样做这项工作时:
<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:内容太长而无法放入内存"写入目标字段(顺便说一句:longblob的大小只有几千字节)。
使用$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>
抱歉,这不是答案,但我不知道如何评论 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 文件的脚本示例),并且可以将 blob 的内容写入文件(使用 odbc 的脚本示例和带有 janino 的图片),所以我将尝试使用带有临时文件的解决方案,但这不是一个漂亮的解决方案。我说的对吗?
有没有更简单的解决方案?
问候雅切克