我正在从一个数据库实现特定于应用程序的数据导入功能.

我有一个包含10000行的CSV文件.需要将这些行插入/更新到数据库中.

可能存在这样的情况:数据库中可能存在几行,这意味着需要更新这些行.如果数据库中不存在,则需要插入.

一种可能的解决方案是,我可以逐行读取,检查数据库中的条目并相应地构建插入/更新查询.但是,此过程可能需要很长时间才能创建更新/插入查询并在数据库中执行它们.有时我的CSV文件可能有数百万条记录.

有没有其他更快的方法来实现此功能?

解决方法:

Oracle提供了一种很好的技术,称为外部表.在您的场景中,您可以使用数据库中的外部表访问外部纯文本数据,并使用您喜欢和习惯的SQL语句更新数据库中的现有数据 – 例如,INSERT,MERGE等.

在大多数情况下,使用Oracle提供的实用程序是执行ETL的最佳方式.因为您的问题听起来更像是管理问题,我建议您查看我以前在DBA Stack Exchange “Update Oracle database from CSV”上的帖子.

更新:这种方法非常适合读取数据库中的外部数据.通常,每次需要处理具有新格式的纯文本文件时,都要定义外部数据格式.创建外部表后,您可以像真正的数据库表一样查询它.每当要导入新数据时,您只需动态替换基础文件,而无需重新创建外部表.由于可以像查询任何其他数据库表一样查询外部表,因此可以编写SQL语句来填充其他数据库表.

与您手动实现的其他技术相比,使用外部表的开销通常较低,因为考虑到Oracle数据库体系结构,该技术在设计时考虑了性能.