Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.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
Sql 将一百万条记录从excel复制到数据库_Sql_Excel_Database_Oracle - Fatal编程技术网

Sql 将一百万条记录从excel复制到数据库

Sql 将一百万条记录从excel复制到数据库,sql,excel,database,oracle,Sql,Excel,Database,Oracle,我的excel工作表中有100万条记录,我想以最快的方式将这些记录复制到oracle数据库中 我知道有两种方法,一种是使用批处理,另一种是使用SQLBulkcopy 除了这两种方法之外,还有没有最快的方法 我还需要创建一个日志文件,其中包含在执行操作时未插入的记录的详细信息。您可以使用任何Excel解析库,如apache poi 它使您能够通读excel电子表格 只需存储每一行和每一列,以及您需要的任何其他数据。 然后,将所有数据传输到您希望在其上查看的服务器/位置 使用此库的我的一个程序的示例

我的excel工作表中有100万条记录,我想以最快的方式将这些记录复制到oracle数据库中

我知道有两种方法,一种是使用批处理,另一种是使用SQLBulkcopy

除了这两种方法之外,还有没有最快的方法


我还需要创建一个
日志文件
,其中包含在执行操作时未插入的记录的详细信息。

您可以使用任何Excel解析库,如apache poi 它使您能够通读excel电子表格

只需存储每一行和每一列,以及您需要的任何其他数据。 然后,将所有数据传输到您希望在其上查看的服务器/位置

使用此库的我的一个程序的示例源:

public boolean read() {
    for (final int sheet : sheets()) {
        final Sheet result = workbook.getSheetAt(sheet);
        if (result != null) {
            results.addAll(results(result));
        }
    }
    if (results().size() > 0) {
        System.out.println("Creating backup database incase any failures occur...");
        createBackup();
        return true;
    }
    return false;
}

public boolean open() {
    try {
        results = new HashSet<E>();
        workbook = new HSSFWorkbook(new POIFSFileSystem(new FileInputStream(new File(location()))));
    } catch (IOException e) {
        System.out.println("IOException getting workbook from speadsheet: " + e.getMessage());
    }
    return results != null && workbook != null;
}
public boolean read(){
对于(最终整型图纸:图纸()){
最终工作表结果=工作簿.getSheetAt(工作表);
如果(结果!=null){
results.addAll(results(result));
}
}
如果(结果().size()>0){
System.out.println(“在发生任何故障时创建备份数据库…”);
createBackup();
返回true;
}
返回false;
}
公共布尔开放(){
试一试{
结果=新的HashSet();
工作簿=新的HSSF工作簿(新的POIFSF文件系统(新的FileInputStream(新的文件(location()))));
}捕获(IOE异常){
System.out.println(“从speadsheet获取工作簿时发生IOException:+e.getMessage());
}
返回结果!=null&&workbook!=null;
}

最快的方法是将excel文件类型设置为CSV,将所有列与表格标题匹配,然后手动将CSV导入表格。

在远程服务器上加载逗号分隔文件的最快方法是通过sql*ldr使用直接路径加载。。如果在同一台服务器上,也可以使用外部表

我建议您使用两个步骤加载。。 首先按照以下步骤创建sql*ldr加载脚本。 然后在oracle客户端中运行生成的脚本。。 如果表没有日志记录,那么在执行脚本之前添加append命令将使其速度更快

话虽如此,对于oracle来说,一百万行太小了,如果表没有大量索引,它应该能够在一分钟内加载


通过并行加载,您可以更快地加载,但这对于一百万行来说是一种过度消耗。

好的,但这是最快的方式吗?我的意思是,如果我们走这条路线,将整个工作表复制到db大约需要多少分钟?这根本不能回答问题。这实际上不能回答问题。但即使代码有点完整,这仍然不是最好的方法,也肯定不是最快的方法。@Ghostider不要这样做。将Excel转换为CSV,上载到数据库服务器,使用数据库CSV工具导入。@ghostrider没有“或”。SQL*Loader属于“数据库CSV工具”集合。如果您想要最快的方法,那么这不应该是Java/JDBC问题。您的标记隐式地限制您使用Java/JDBC解决方案。将其转换为CSV并使用SQL*loader加载。我敢打赌这很快。@KaushikNayak的评论速度最快,不需要«复制»只需使用oracle直接打开csv文件……导入前也要删除索引,导入后再重新创建索引。