Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取或检索大规模插入SQLLDR后生成的PK_Java_Sql_Weblogic_Oracle12c_Sql Loader - Fatal编程技术网

Java 获取或检索大规模插入SQLLDR后生成的PK

Java 获取或检索大规模插入SQLLDR后生成的PK,java,sql,weblogic,oracle12c,sql-loader,Java,Sql,Weblogic,Oracle12c,Sql Loader,我现在就直接告诉你我的情况。我在一个项目中工作,该项目将基于excel(xlsx,xls)文件执行“基本加载”过程。它是用java和JDBC驱动程序开发的。现在这个项目正在工作,它需要一个excel文件,并根据一个配置将insert执行到不同的表中。关键是:这项工作耗时太长,效率低下。(在数据库中插入3000条记录大约需要2小时)。在未来,该软件将插入约30k条记录,速度将非常缓慢。所以我需要提高它的效率,我在想:而不是通过JDBC驱动程序从java插入。我将使用SQLLDR生成要插入数据库的控

我现在就直接告诉你我的情况。我在一个项目中工作,该项目将基于excel(xlsx,xls)文件执行“基本加载”过程。它是用java和JDBC驱动程序开发的。现在这个项目正在工作,它需要一个excel文件,并根据一个配置将insert执行到不同的表中。关键是:这项工作耗时太长,效率低下。(在数据库中插入3000条记录大约需要2小时)。在未来,该软件将插入约30k条记录,速度将非常缓慢。所以我需要提高它的效率,我在想:而不是通过JDBC驱动程序从java插入。我将使用SQLLDR生成要插入数据库的控制文件和数据文件

我现在面临的问题是,我需要将这些数据插入到几个表中,这些表相互关联。也就是说,如果我在“person_table”中插入一个人,我需要数据库序列生成的主键将“Address、Phone、email等”插入到其他表中,因此我不知道如何通过SQLLDR获取第一次插入时生成的主键

我还不确定SQLLDR是否是实现这一点的最佳方法,但我想是的,因为DBMS是Oracle

你们能告诉我该怎么做吗?我向你们解释了我需要做的事?任何建议都是受欢迎和欢迎的。如果您的建议不是关于如何使用SQLLDR实现这一点,这并不重要


我现在有点困在这一点上,我真的很感谢你能给我的帮助。

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

当您需要操作外键约束时,考虑切换到“强”>外部表基本上,后台仍然是SQLLoad,但您可以在这些文件/表上写入(PL/SQL)(是的——CSV文件,存储在硬盘上,就好像它是一个Oracle表)。 因此,您需要“加载”一个表,填充主键值,填充另一个(子)表-可能是一个没有启用任何约束的“临时”(不一定是全局临时表),填充外键值,并将数据移动到一个约束现在不会失败的“真实”目标表中

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


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

非常感谢你的回答@Littlefoot。目前SQLLDR没有读取excel文件,而是由我的java应用程序读取,该应用程序将excel文件中的所有记录转换为“插入”。在这个使用JDBC驱动程序的java软件中,这些插入正在提高性能,但是插入记录的时间太长了。所以基本上,我将修改源代码以生成数据文件和控制文件(与SQLLDR一起使用),而不是性能插入。不管怎样,你的解决方案是有效的,我会考虑的。当然,一小时1500行是一场灾难,你不能这样工作。纯插入需要几毫秒才能完成,所以-当前的方法确实有问题。我希望你能设法改进它!这肯定是有问题的——java实现或统计数据。若它真的是2小时3000条记录(不是30mio),那个么我建议调试java应用程序并找到瓶颈。SQLLDR能够在5分钟内上传12+mio记录的多列文件(我的经验)。非常感谢您的回答@MaximBorunov。java应用程序中确实存在一些错误。启动该项目的团队由于在每次“插入”之前对DB重复执行“选择”语句而消耗了太多资源。我在路上调试,尽量解决问题。PD:肯定没有办法检索SQLLDR插入生成的PKs?SQLLDR不能返回值,不是吗?不,SQLLDR不是为此而设计的。如果您仍然需要访问SQLLDR,那么按照@Littlefoot的答案-在一些临时表中填充数据,然后运行pl/sql过程,将数据迁移到主表中,并为外键列设置正确的ID。但是,最好的方法还是修复java代码。