首页 > 解决方案 > 在大量插入 SQLLDR 后获取或检索生成的 PK

问题描述

我现在就直接说一下我的情况。我正在一个项目中工作,该项目将基于 excel(xlsx,xls)文件执行“基本加载”过程。它是用 java 开发的,带有 JDBC 驱动程序。现在这个项目正在运行,它需要一个 excel 文件并基于配置它执行插入到不同表中。关键是:做这项工作花费的时间太长,这使得它效率低下。(在 DB 上插入 3000 条记录大约需要 2 小时)。以后这个软件会插入3万条左右的记录,速度会很慢。所以我需要提高它的效率,我在想:而不是通过 JDBC 驱动程序从 java 插入。我将使用 SQLLDR 生成要插入数据库的控制文件和数据文件。

我现在面临的问题是,我需要将这些数据插入到几个表中,并且这些表是相互关联的。这意味着,如果我将一个人插入“Person_table”,我将需要由数据库序列生成的主键来插入“地址、电话、电子邮件等”。到其他表中,所以我不知道如何通过 SQLLDR 获取第一次插入时生成的主键。

我不确定 SQLLDR 是否是我最好的方法,但我想是的,因为 DBMS 是 Oracle

你们能指导我如何做我向你们解释我需要做的事情吗?欢迎提出任何建议并广受好评。如果您的建议不是关于如何使用 SQLLDR 执行此操作,则无关紧要。

我现在有点卡在这一点上,我非常感谢你能给我的帮助。

标签: javasqlweblogicoracle12csql-loader

解决方案


SQL*Loader 无法读取本机 Excel 文件(至少,据我所知)。因此,您必须将结果保存为 CSV 文件。

由于您需要操作外键约束,请考虑切换到外部表功能 - 基本上,后台仍然是 SQL*Loader,但您可以针对这些文件/表编写 (PL/)SQL(是的 - CSV 文件,存储在硬盘,就好像它是一个 Oracle 表一样)。

因此,您将“加载”一个表,填充主键值,填充另一个(子)表 - 可能进入一个没有启用任何约束的“临时”(不一定是全局临时表),填充外键值并将数据移动到约束现在不会失败的“真实”目标表中。

可能的缺点:CSV 文件必须驻留在数据库服务器可访问的目录中,因为您必须创建一个目录(Oracle 对象)并向将使用它的用户授予所需的权限(通常为read、write )。目录通常是在服务器本身上创建的;如果没有,您必须在创建时使用 UNC。

现在你有一些东西要阅读/研究;看看这对你是否有意义。


推荐阅读