设想情况:
编辑:非常有用的答案已经-谢谢!更多关于那个讨厌的输入文件。字段的数量是可变的,位置也发生了几次变化--我的当前脚本通过分析标题行来确定内容(好,快捷键和狡猾的转换器会这样做)。因此,如果没有加载文件的几个版本,直接上传和后处理SQL就无法工作,这是很可怕的。这也是一个德国CSV文件:分号分隔(没什么大不了)和小数表示逗号(更大的交易,除非我们加载为VARCHAR和文本进程后- ugh)。
问题是:
以7/秒的速度加载200万行将需要超过24小时的时间!这可能是一个缺点,一个日常的过程,更不用说,用户更希望能够访问数据约5个小时后,它成为可用的CSV形式!
我看过在每次网络行程中应用多个插入:非常笨拙的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;(我说的是粗俗吗?)尝试对所有三行使用相同的id。Oracle docus似乎证实了这一点。
最近的尝试是在一次执行中发送多个插入,例如:
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块实现了这一点。现在,如果出现了另一个平台,更改将仅限于在代码中更改适配器:很可能是一行。
发布于 2009-02-11 13:30:46
你可以用:
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批处理指令发送:
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发布于 2009-02-11 13:24:39
如何将csv文件传送到oracle服务器,使用SQLLoader将csv文件加载到暂存表中,然后运行存储过程将其转换并插入到最终表中?
发布于 2009-02-11 14:13:17
我将使用SQL*Loader将原始CSV文件加载到数据库中的专用表中,而不对其进行规范化,然后对表中的数据运行代码,将其规范化为各种必需的表。这将减少往返行程,并且是Oracle社区中一种非常传统的方法。
在初始学习曲线方面,SQL*Loader可能有点挑战性,但是如果您陷入困境,您可以很快发布。
ldr.htm#i436326
https://stackoverflow.com/questions/536712
复制相似问题