我对编程和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");
}
}
您只需使用一个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);
}
}
}
}
}
您不需要同时使用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