我可以将"批量"INSERT发送给Oracle吗?

Mik*_*use 1 ruby sql oracle ruby-on-rails

场景:

  • 我每天将一些数据加载到本地MySQL数据库中,大约200万行;
  • 我必须(必须 - 这是审计/监管的事情)转移到"正确"管理的服务器,目前看起来是Oracle 10g;
  • 服务器位于不同的国家:网络往返电流需要60-70毫秒;
  • 输入是非规范化形式的CSV文件:我在加载前对数据进行规范化,每行通常在最多4个表中产生3-8个INSERT;
  • 加载脚本目前使用ActiveRecord和fastercsv在Ruby中实现.我已经尝试过ar-extensions gem,但它假设MySQL样式的多值子句的想法是可行的.它没有.

编辑:非常有用的答案 - 谢谢你!更多关于那个讨厌的输入文件.字段数是可变的,位置已经改变了几次 - 我当前的脚本通过分析标题行来确定内容(好吧,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块实现了这一点.现在,如果出现另一个平台,则更改将仅限于更改代码中的适配器:一个单行,很可能.

Nun*_*o G 10

如何将csv文件传送到oracle db服务器,使用SQLLoader将csv文件加载到临时表中,然后运行存储过程来转换并在最终表中插入它?