我现在会直接谈谈我的处境。我正在一个项目中,该项目将基于excel(xlsx,xls)文件执行“基本加载”过程。它是使用JDBC驱动程序在Java中开发的。现在,该项目正在运行,它需要一个excel文件,并基于配置,它可以执行不同表的插入。关键是:做这项工作花了太长时间,这使其效率低下。 (在数据库上插入3000条记录大约需要2个小时)。将来,该软件将被插入约3万条记录,而且速度非常慢。因此,我需要提高其效率,我在想:不要通过JDBC驱动程序从Java插入。我将使用SQLLDR生成要插入到DB中的控制文件和数据文件。
我现在要面对的问题是,我需要将这些数据插入几个表中,并且这些表彼此相关。这意味着,如果我将一个人插入“ Person_table”,则需要由数据库序列生成的主键来插入“地址,电话,电子邮件等”。到其他表中,所以我不知道如何通过SQLLDR获取在第一次插入中生成的主键。
我不确定SQLLDR是否是我执行此操作的最佳方法,但是我想是这样,因为DBMS是Oracle
你们能带我介绍我如何做我向你们解释的我需要做的事情吗?任何建议都值得欢迎和好评。您的建议是否与如何使用SQLLDR无关紧要。
此刻,我感到很困惑,非常感谢您能为我提供的帮助。
答案 0 :(得分:1)
SQL * Loader无法读取本机Excel文件(至少据我所知)。因此,您必须将结果另存为CSV文件。
由于需要操纵外键约束,请考虑切换到外部表功能-基本上,背景仍然是SQL * Loader,但是您可以针对这些文件/表编写(PL /)SQL (是的-存储在硬盘上的CSV文件就像是Oracle表一样。)
因此,您将“加载”一个表,填充主键值,填充另一个(子)表-可能会填充到一个“临时”(不一定是全局临时表)中,启用任何约束,填充外键值并将数据移到约束不会失效的“真实”目标表中。
可能的缺点:CSV文件必须驻留在数据库服务器可访问的目录中,因为您必须创建目录(Oracle对象)并授予所需的特权(通常为读取,写入)给将要使用它的用户。目录通常是在服务器本身上创建的;如果没有,则在创建UNC时必须使用UNC。
现在您可以阅读/研究一些内容;看看是否对您有意义。