繁体   English   中英

使用 Java 从 csv 批量插入 Oracle DB 中的表

[英]Bulk insert from a csv to a table in an Oracle DB using Java

我正在尝试使用 java 在 Oracle 数据库中插入一个表。 我正在使用 OpenCSV 逐行读取 csv 文件。 csv大约有50000行9列。 这是我的一些代码:

            /* Create Connection objects */
            Class.forName ("oracle.jdbc.OracleDriver"); 
            Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@HoSt", "UsErNaMe", "PaSsWoRd");
            PreparedStatement sql_statement = null;
            String jdbc_insert_sql = "INSERT INTO METATADA_AUTOSYS"
                            + "(MACH_NAME,JOB_NAME,SCRIPT_COMMAND,APPLICATION_NAME,JOB_ID,STATUS,CREATE_DATE,LAST_START_DT,LAST_END_DT) VALUES"
                            + "(?,?,?,?,?,?,?,?,?)";
            sql_statement = conn.prepareStatement(jdbc_insert_sql);
            /* Read CSV file in OpenCSV */
            String inputCSVFile = "C:/Users/conwacx/Desktop/meta_auto_v3/Autosys_Metadata.csv";
            CSVReader reader = new CSVReader(new FileReader(inputCSVFile));         
            String [] nextLine; 
            int lnNum = 0; 
            int batchSize = 5000;
            //loop file , add records to batch
            try{    
                while ((nextLine = reader.readNext()) != null) {
                    lnNum++;
                    /* Bind CSV file input to table columns */
                    sql_statement.setString(1, nextLine[0]);
                    sql_statement.setString(2,nextLine[1]);
                    sql_statement.setString(3,nextLine[2]);
                    sql_statement.setString(4,nextLine[3]);
                    sql_statement.setString(5,nextLine[4]); //setInt(Integer.parseInt(nextLine[4].trim());
                    sql_statement.setString(6,nextLine[5]);
                    sql_statement.setObject(7, nextLine[5]);
                    sql_statement.setString(8,nextLine[7]);
                    sql_statement.setString(9,nextLine[8]);
                    sql_statement.addBatch();
                    // Add the record to batch
                    if (++batchSize % 5000 == 0){
                            sql_statement.executeBatch();
                    }



            }
            sql_statement.executeBatch();
        }
            catch(SQLException e){
                e.printStackTrace();
            }                 
            //Perform a bulk batch insert              
            int[] totalRecords = new int[7];
            try {
                    totalRecords = sql_statement.executeBatch();
            } catch(BatchUpdateException e) {
                    //handle exception for failed records here
                    totalRecords = e.getUpdateCounts();
            } catch(SQLException ex){
                    ex.printStackTrace();
            }
            System.out.println ("Total records inserted in bulk from CSV file " + totalRecords.length);                
            /* Close prepared statement */
            sql_statement.close();
            /* COMMIT transaction */
            conn.commit();
            /* Close connection */
            conn.close();
    }

运行此程序时我没有收到错误。 它正在打印: Total records inserted in bulk from CSV file 0该表未使用 Oracle 中的新值进行更新。 有什么建议么?

如果达到批量大小,则仅执行一次sql_statement.executeBatch()
executeBatch()正在返回一个包含结果的数组(有多少行受到影响)。
所以你必须添加数组的每个元素来计算总计数。
执行批处理的条件也是错误的。

我无法证明,但我会像这样更改您的示例(仅更改部分):

public void insertData() throws ClassNotFoundException, SQLException, IOException {
  /* Create Connection objects */
  Class.forName("oracle.jdbc.OracleDriver");
  String jdbc_insert_sql = "INSERT INTO METATADA_AUTOSYS"
   + "(MACH_NAME,JOB_NAME,SCRIPT_COMMAND,APPLICATION_NAME,JOB_ID,STATUS,CREATE_DATE,LAST_START_DT,LAST_END_DT) VALUES"
    + "(?,?,?,?,?,?,?,?,?)";

  int totalRecords = 0;
  final int batchSize = 5000;
  /* Read CSV file in OpenCSV */
  String inputCSVFile = "C:/Users/conwacx/Desktop/meta_auto_v3/Autosys_Metadata.csv";
  try (CSVReader reader = new CSVReader(new FileReader(inputCSVFile))) {
    try (Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@HoSt", "UsErNaMe", "PaSsWoRd")) {
      try (PreparedStatement sql_statement = conn.prepareStatement(jdbc_insert_sql);) {
        String[] nextLine;
        int lnNum = 0;
        // loop file , add records to batch
        try {
          while ((nextLine = reader.readNext()) != null) {
            lnNum++;
            /* Bind CSV file input to table columns */
            sql_statement.setString(1, nextLine[0]);
            sql_statement.setString(2, nextLine[1]);
            sql_statement.setString(3, nextLine[2]);
            sql_statement.setString(4, nextLine[3]);
            sql_statement.setString(5, nextLine[4]);
            sql_statement.setString(6, nextLine[5]);
            sql_statement.setObject(7, nextLine[5]);
            sql_statement.setString(8, nextLine[7]);
            sql_statement.setString(9, nextLine[8]);
            sql_statement.addBatch();
            // Add the record to batch
            if (lnNum >= batchSize) {
              // Perform a bulk batch insert
              totalRecords += doExecute(sql_statement);
              lnNum = 0;
            }
          }
          // insert the last rows
          if ( lnNum >= 0 ) {
            totalRecords += doExecute(sql_statement);
          }
        } catch (SQLException e) {
          e.printStackTrace();
        }
      }
      System.out.println("Total records inserted in bulk from CSV file " + totalRecords);
      /* COMMIT transaction */
      conn.commit();
    }
  }
}

private int doExecute(PreparedStatement sql_statement) {
  int totalRecords = 0;
  int[] results = null;
  try {
    results = sql_statement.executeBatch();
    for (int i = 0; i < results.length; i++) {
      totalRecords += results[i];
    }
  } catch (BatchUpdateException e) {
    // handle exception for failed records here
    results = e.getUpdateCounts();
    for (int i = 0; i < results.length; i++) {
      totalRecords += results[i];
    }
  } catch (SQLException ex) {
    ex.printStackTrace();
  }
  return totalRecords;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM