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