Mik*_*use 1 ruby sql oracle ruby-on-rails
编辑:非常有用的答案 - 谢谢你!更多关于那个讨厌的输入文件.字段数是可变的,位置已经改变了几次 - 我当前的脚本通过分析标题行来确定内容(好吧,fastcsv和一个狡猾的转换器这样做).因此,如果没有多个版本的加载文件,直接上传和后期处理SQL将无法运行,这很糟糕.它也是一个德国的CSV文件:用冒号分隔(没什么大不了的)和用逗号表示的小数(相当大的交易,除非我们加载为VARCHAR和文本处理之后 - 呃).
以大约7 /秒的速度装载200万行将需要超过24小时!这可能是日常流程的一个缺点,更不用说用户希望能够以CSV格式提供大约5个小时后才能访问数据!
我考虑过每次网络访问应用多个插入:相当笨拙的INSERT ALL...语法很好,除了目前我正在使用一个序列为每一行应用一个唯一的id.它发生了这一点
INSERT ALL
INTO tablea (id,b,c) VALUES (tablea_seq.nextval,1,2)
INTO tablea (id,b,c) VALUES (tablea_seq.nextval,3,4)
INTO tablea (id,b,c) VALUES (tablea_seq.nextval,5,6)
SELECT 1 FROM dual;
Run Code Online (Sandbox Code Playgroud)
(我说它是笨拙的吗?)尝试对所有三行使用相同的id.Oracle docus似乎证实了这一点.
最新的尝试是在一次执行中发送多个INSERT,例如:
INSERT INTO tablea (id,b,c) VALUES (tablea_seq.nextval,1,2);
INSERT INTO tablea (id,b,c) VALUES (tablea_seq.nextval,3,4);
INSERT INTO tablea (id,b,c) VALUES (tablea_seq.nextval,5,6);
Run Code Online (Sandbox Code Playgroud)
我还没有办法说服甲骨文接受这一点.
无论出于何种原因,我更喜欢让我的代码尽可能不受特定于平台的构造的影响:出现这个问题的一个原因是我正在从MySQL迁移到Oracle; 由于地理原因,可能有一天会发生另一次移动,我无法确定该平台.因此,使我的数据库库可以使用文本SQL命令来实现合理的扩展是有吸引力的,并且PL/SQL块实现了这一点.现在,如果出现另一个平台,则更改将仅限于更改代码中的适配器:一个单行,很可能.