Прочтите CSV-файл (Distinct Record) и запишите его в Oracle, используя Java - ORA-00001: уникальное ограничение (DUMMY.SYS_C008271) нарушено

Я новичок в программировании и Java. Поэтому, когда я запустил свой Java-код, я получил следующие ошибки. Я понимаю, что моя таблица Oracle имеет уникальное ограничение, поэтому как мне прочитать только отдельное значение, чтобы, когда оно записывается в таблицу, оно не выдавало мне уникальной ошибки ограничения? Когда я попытался временно отключить ограничение, все работает нормально. Но я не должен переделывать стол. Итак, мне нужно выяснить, как читать ТОЛЬКО отдельные записи из файла CSV и записывать их в базу данных.

PS: Это легко сделать в базе данных, вот мой псевдокод: INSERT INTO TABLE_ORACLE (Col1, Col2, Col3, Col4) SELECT DISTINCT Col1, Col2, Col3, Col4 FROM TABLE_CSV

Большое спасибо!!

package dummy;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException; 
import java.util.Properties;
import java.io.*;

public class Main {
public static void main(String[] args) {

    String csvFile = "C:/Users/Jane/Documents/dummyfile.csv";
    BufferedReader br = null;
    String line = "";
    String csvSplitBy = ",";

    try {

        br = new BufferedReader(new FileReader(csvFile));
        for (; (line = br.readLine()) != null;) {
            while ((line = br.readLine()) != null) {
                // use comma as separator
                String[] data = line.split(csvSplitBy);
                if (data.length == 18) {
                    db_loader(data);
                }
            }
        }
    } 
    catch (Exception e) {
        e.printStackTrace();
    } 
    finally {
        if (br != null) {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    System.out.println("Done1");
}

public static void db_loader(String[] da) throws SQLException {
    String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
    Properties props = new Properties();
    props.setProperty("user", "dummy999");
    props.setProperty("password", "dummy123");
    Connection conn = DriverManager.getConnection(url, props);
    PreparedStatement preStatement2 = conn
            .prepareStatement("insert into TABLE_ORACLE (col1, col2, col3, col4) values (?, ?, ?, ?)");
    for (int i = 0; i < da.length; i++) {
        preStatement2.setString(i + 1, da[i]);
    }
    preStatement2.executeQuery();
    preStatement2.close();
    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("done2");

}
}

person John    schedule 03.03.2014    source источник


Ответы (2)


Вам не нужны циклы for и while. Я думаю, вы пытаетесь ограничить количество обновлений до 18 на оператор в load_db, но это не сработает.

Вместо этого создайте двумерный массив из 18 строк и 4 столбцов (количество полей в строке CSV).

Кроме того, когда мы достигаем последней строки CSV в br, i может быть меньше 18, поэтому вам нужно выполнить db_load для содержимого csv_data после выхода из цикла чтения.

final int MAX_ROWS = 18;
final int CSV_FIELDS = 4;
int i=0;
String[][] csv_data = new String[MAX_ROWS][CSV_FIELDS];
while ((line = br.readLine()) != null) {
   // use comma as separator
   csv_data[i++] = line.split(csvSplitBy);
   if (i == 18) {
        db_loader(csv_data);
        i=0;
   }
}
if(i>0) db_loader(csv_data);
person deanosaur    schedule 03.03.2014

Вы можете просто использовать HashSet Которая принимает уникальные записи и возвращает false, если запись (ключ) уже существует.

   Set<String> uniqueLines = null;

    try {

        uniqueLines   new HashSet<String>();
        br = new BufferedReader(new FileReader(csvFile));
        for (; (line = br.readLine()) != null;) {
            while ((line = br.readLine()) != null) {
               if(uniqueLines.add(line)) {// true only when it is unique record
                 // use comma as separator
                 String[] data = line.split(csvSplitBy);
                 if (data.length == 18) {
                     db_loader(data);
                 }
                }
            }
        }
    } 
person Maheswaran Ravisankar    schedule 03.03.2014