2014-03-03 5 views
0

프로그래밍 및 Java가 완전히 새로운 것입니다. 따라서 Java 코드를 실행하면 다음과 같은 오류가 발생합니다. 나는 오라클 테이블에 고유 한 제약이 있다는 것을 알고 있으므로 고유 한 값만 읽으면 어떻게 테이블에 기록 될 때 고유 한 제약 조건 오류가 발생하지 않습니까? 일시적으로 제약 조건을 해제하려고하면 모든 것이 정상적으로 작동합니다. 그러나 나는 테이블을 바꾸기로되어 있지 않습니다. 그래서 내가 필요로하는 것은 CSV 파일에서 유일한 레코드 만 읽고 데이터베이스에 쓰는 방법을 찾는 것입니다.CSV 파일 (고유 레코드)을 읽고 Java를 사용하여 Oracle에 쓰기 - ORA-00001 : 고유 제한 조건 (DUMMY.SYS_C008271) 위반됨

PS : 여기, 데이터베이스에 그것을 쉽게 내 의사입니다 (COL1은, Col2의, 열 3, Col4가) SELECT TABLE_ORACLE INTO INSERT DISTINCT COL1, Col2의, 열 3, Col4 TABLE_CSV

FROM

고마워요 !!

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"); 

} 
} 

답변

0

for 및 while 루프가 모두 필요하지 않습니다. 난 당신 load_db에 성명서 당 18 업데이 트의 수를 제한하려고 생각하지만,이 작동하지 않습니다.

대신 18 행 4 열 (CSV 행의 필드 수)으로 2 차원 배열을 만드십시오.

또한 br의 마지막 CSV 행에 도달하면 18보다 작을 수 있으므로 읽기 루프를 종료 한 후 csv_data의 내용에 db_load를 실행해야합니다.

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); 
0

당신은 단순히 독특한 기록을 받아들이고, 기록 (키가) 이미 존재하는 경우 false를 반환하는 HashSet를 사용할 수 있습니다.

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); 
       } 
       } 
      } 
     } 
    }