首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以将“批处理”插入发送给Oracle吗?

我可以将“批处理”插入发送给Oracle吗?
EN

Stack Overflow用户
提问于 2009-02-11 13:18:12
回答 6查看 4.2K关注 0票数 1

设想情况:

  • 我每天将一些数据加载到本地MySQL数据库中,大约有200万行;
  • 我必须(必须-这是一个审计/监管的事情)移动到一个“适当”管理的服务器,它目前看起来是甲骨文10g;
  • 服务器位于不同的国家:一个网络往返电流需要60-70毫秒;
  • 输入是一个非规范化格式的CSV文件:我在加载之前对数据进行规范化,每一行通常会在4个表中插入3-8个;
  • load脚本目前是用Ruby实现的,使用的是ActiveRecord和ActiveRecord。我已经尝试过ar扩展创业板,但它假设MySQL风格的多值子句的想法将有效。事实并非如此。

编辑:非常有用的答案已经-谢谢!更多关于那个讨厌的输入文件。字段的数量是可变的,位置也发生了几次变化--我的当前脚本通过分析标题行来确定内容(好,快捷键和狡猾的转换器会这样做)。因此,如果没有加载文件的几个版本,直接上传和后处理SQL就无法工作,这是很可怕的。这也是一个德国CSV文件:分号分隔(没什么大不了)和小数表示逗号(更大的交易,除非我们加载为VARCHAR和文本进程后- ugh)。

问题是:

以7/秒的速度加载200万行将需要超过24小时的时间!这可能是一个缺点,一个日常的过程,更不用说,用户更希望能够访问数据约5个小时后,它成为可用的CSV形式!

我看过在每次网络行程中应用多个插入:非常笨拙的INSERT ALL...语法会很好,只是目前我正在使用一个序列对每一行应用一个唯一的id。事实证明

代码语言:javascript
复制
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;

(我说的是粗俗吗?)尝试对所有三行使用相同的id。Oracle docus似乎证实了这一点。

最近的尝试是在一次执行中发送多个插入,例如:

代码语言:javascript
复制
    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);

我还没有找到说服甲骨文接受这一点的方法。

问题

  • 我错过什么明显的东西了吗?(如果结果是这样的话,我会很高兴的!)
  • 如果我不能发送多个插入,我还能尝试什么?

为什么要接受这个?

不管出于什么原因,我更愿意让我的代码尽可能地不受特定于平台的构造的影响:出现这个问题的原因之一是我正在从MySQL迁移到甲骨文;有一天,由于地理原因,可能会发生另一次迁移,而我对这个平台并不确定。因此,让我的数据库库能够使用文本SQL命令来实现合理的缩放是很有吸引力的,PL/SQL块实现了这一点。现在,如果出现了另一个平台,更改将仅限于在代码中更改适配器:很可能是一行。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-02-11 13:30:46

你可以用:

代码语言:javascript
复制
insert into tablea (id,b,c)
 ( select tablea_seq.nextval,1,2 from dual union all
   select tablea_seq.nextval,3,4 from dual union all
   select tablea_seq.nextval,3,4 from dual union all
   select tablea_seq.nextval,3,4 from dual union all
   ...
 )

当我正确地记起时,这个方法可以工作到1024行。

您还可以将其作为PL/SQL批处理指令发送:

代码语言:javascript
复制
BEGIN
 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);
 ...
 COMMIT;
END
票数 4
EN

Stack Overflow用户

发布于 2009-02-11 13:24:39

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

票数 10
EN

Stack Overflow用户

发布于 2009-02-11 14:13:17

我将使用SQL*Loader将原始CSV文件加载到数据库中的专用表中,而不对其进行规范化,然后对表中的数据运行代码,将其规范化为各种必需的表。这将减少往返行程,并且是Oracle社区中一种非常传统的方法。

在初始学习曲线方面,SQL*Loader可能有点挑战性,但是如果您陷入困境,您可以很快发布。

ldr.htm#i436326

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/536712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档