当前位置: 首页 > 知识库问答 >
问题:

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

惠泳
2023-03-14

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

PS:在数据库上很容易做到这一点,下面是我的伪代码:INSERT INTO TABLE\u ORACLE(Col1,Col2,Col3,Col4)从TABLE\u CSV中选择不同的Col1,Col2,Col3,Col4

非常感谢!!

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

}
}

共有2个答案

须彭亮
2023-03-14

您只需使用一个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);
                 }
                }
            }
        }
    } 
许焕
2023-03-14

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

相反,创建一个具有18行4列的二维数组(CSV行中的字段数)。

此外,当我们到达br中的最后一行CSV时,i可能小于18,因此您需要在退出读取循环后对CSV\U数据的内容执行db\U加载。

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);
 类似资料:
  • 我正试图插入数据库,但我在日志上看到了这样的消息: 我找到了这个查询以获取违反的密钥:

  • 以下是SQL部分,我在调试代码时出错: ORA-00001:唯一约束主键违反T_LIAV_AGENT_STATE_APPROVAL... 这是主键约束依赖的2列AV_NAME_ID,AV_STATE... 我没有重复的数据...你认为还有其他原因吗?

  • 我有两张表, 但我做了一个组声明,以确保from\t的名称是唯一的: 我不确定我是否正确理解了这个问题。我尽了我所能,但仍然没有运气。

  • 问题内容: 我正在使用Oracle数据库。我们的服务呼叫频繁失败。当我查看日志时,在表上看到以下异常 java.sql.BatchUpdateException:ORA-00001:违反了唯一约束(DBSCHEMA.IDX_CO_DETAILS)。 我已经检查了表上索引的索引名称DBSCHEMA.IDX_CO_DETAILS。 它不包含任何列的(INCLUDE_COLUMN为null)。我怎么知道

  • 问题内容: 目标: 交换两个记录的主键,而不会遇到ORA-00001:违反了唯一约束。“可行”的解决方案(在下文中)只是一个破解。是否有一项功能/技术可以将约束执行推迟到提交事务之前? motivation -使用此数据的遗留应用程序存在设计缺陷,并且依赖于ID顺序和值-请求是按以下方式交换PK值: What doesn’t Work: Hack/Solution that ‘works’ Tab