Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.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
读取CSV文件(不同的记录)并使用Java-ORA-00001将其写入Oracle:违反了唯一约束(DUMMY.SYS_C008271)_Java_Oracle_Csv_Filereader_Unique Constraint - Fatal编程技术网

读取CSV文件(不同的记录)并使用Java-ORA-00001将其写入Oracle:违反了唯一约束(DUMMY.SYS_C008271)

读取CSV文件(不同的记录)并使用Java-ORA-00001将其写入Oracle:违反了唯一约束(DUMMY.SYS_C008271),java,oracle,csv,filereader,unique-constraint,Java,Oracle,Csv,Filereader,Unique Constraint,我对编程和Java完全陌生。因此,当我运行Java代码时,我得到了以下错误。我知道我的Oracle表有一个唯一的约束,所以我如何只读取一个不同的值,这样当它写入表时,它就不会给我一个唯一的约束错误?当我尝试暂时禁用约束时,一切正常。但是我不应该改变桌子。所以我需要弄清楚如何从CSV文件中只读取不同的记录并将其写入数据库 PS:在数据库上很容易做到,下面是我的伪代码: 插入表1、表2、表3、表4 选择不同的Col1、Col2、Col3、Col4 从表_CSV 非常感谢 package dummy;

我对编程和Java完全陌生。因此,当我运行Java代码时,我得到了以下错误。我知道我的Oracle表有一个唯一的约束,所以我如何只读取一个不同的值,这样当它写入表时,它就不会给我一个唯一的约束错误?当我尝试暂时禁用约束时,一切正常。但是我不应该改变桌子。所以我需要弄清楚如何从CSV文件中只读取不同的记录并将其写入数据库

PS:在数据库上很容易做到,下面是我的伪代码: 插入表1、表2、表3、表4 选择不同的Col1、Col2、Col3、Col4 从表_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");

}
}

您不需要同时使用for和while循环。我认为您试图将load_db中每条语句的更新次数限制为18次,但这行不通

相反,在CSV行中创建一个包含18行和4列字段数的二维数组

另外,当我们到达br中的最后一行CSV时,i可能小于18,因此您需要在退出读取循环后对CSV_数据的内容执行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);
您只需使用一个函数,它接受唯一的记录,并在记录键已经存在时返回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);
                 }
                }
            }
        }
    }