使用java从txt文件插入oracle DB

Roc*_*ock 0 java sql oracle jdbc oracle11g

我试图从文件中获取数据并使用java将其插入数据库.以下是我的java代码:

package edgelist;
import java.io.*;
import java.util.*;
import java.lang.Math.*;
import java.sql.*;

public class Edgelist {
    private static int getRandomNumberInRange(int min, int max){
        if (min >= max) {
            throw new IllegalArgumentException("max must be greater than min");
        }
        Random r = new Random();
        return r.nextInt((max - min) + 1) + min;
    }

    public static void main(String args[]) throws Exception {
        FileInputStream f=null;
        int i,c=1;
        String num="";
        Class.forName("oracle.jdbc.driver.OracleDriver");
        Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE",
                                                     "project",
                                                     "project");
        Statement stmt=con.createStatement();
        String s=null,ver1=null,ver2=null;
        int serial=0,type;
        //PreparedStatement ps=con.prepareStatement(s);

        try {
            f=new FileInputStream("F:\\College Project\\dolphin.txt");
            do {
                i=f.read();
                if(i!=-1) {
                    if((char) i !=' ' && (char) i !='\n' && (char) i !='\r') {
                        num=num+(char) i;
                    } else {
                        if(!num.matches("")) {
                            if((char) i == ' ') {
                                //System.out.println("Random:"+getRandomNumberInRange(1, 10)+" "+num);
                                serial=++c;
                                ver1=num;
                            } else if(!((char) i >= '0') && ((char) i <= '9')) {
                                ver2=num;
                            }
                        }
                        num="";
                        type=getRandomNumberInRange(1, 10);
                        s="insert into edges(serial_no, vertex1, vertex2, edge_type)"
                           +"values("+serial+", '"+ver1+"', '"+ver2+"', "+type+")";
                        stmt.executeQuery(s);
                    }

                }
            } while(i!=-1);
        } catch(FileNotFoundException e) {
            System.out.println(e);
        }
        catch(IOException e) {
            System.out.println(e);
        } finally  {
            try {
                if(f != null)
                    f.close();
                con.close();
            } catch(IOException e) {
                System.out.println(e);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码正确地从文件中获取数据,但在尝试插入数据库时​​,它会产生以下错误

线程"main"java.sql.SQLException中的异常:ORA-00001:违反了唯一约束(PROJECT.SYS_C004002)

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288) )oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:207)at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java: 946)atracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1169)at edge.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1273)at edgelist.Edgelist.main(Edgelist.java:77)Java结果:1

这是桌边结构

CREATE TABLE  "EDGES" (
    "SERIAL_NO" NUMBER, 
    "VERTEX1" VARCHAR2(10) NOT NULL ENABLE, 
    "VERTEX2" VARCHAR2(10) NOT NULL ENABLE, 
    "EDGE_TYPE" NUMBER, 
     PRIMARY KEY ("SERIAL_NO") ENABLE, 
     FOREIGN KEY ("EDGE_TYPE")
     REFERENCES  "TYPES" ("SERIAL_NO") ENABLE
)
Run Code Online (Sandbox Code Playgroud)

TYPES表包含1到10之间的值,该文件dolphin.txt是包含以下数据的edgelist:

3  8
5  9
6  9
0  10
2  10
5  13
6  13
9  13
0  14
3  14
0  15
14 16
1  17
6  17
9  17
13 17
15 18
1  19
7  19
8  20
16 20
18 20
18 21
17 22
14 24
15 24
Run Code Online (Sandbox Code Playgroud)

Ste*_*ini 5

该错误意味着您正在尝试使用已存在于表中的键插入行.

你定义了一个主键SERIAL_NO,并且该字段填充了你的serial变量,但问题是你并不总是执行serial=++c;,因为它在一个if语句中.

这意味着您可以serial多次插入相同的值,因此会出现错误.