2017-05-02 18 views
0

ファイルからデータをフェッチし、javaを使用してデータベースに挿入しようとしています。次は私のJavaコードです:javaを使用してtxtファイルからoracle DBに挿入

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

このコードは正しくファイルからデータをフェッチしているが、DBに挿入しようとしたときに、それがスレッド「メイン」java.sqlでのエラー

例外を次与えます.SQLException:ORA-00001:ユニーク 制約(PROJECT.SYS_C004002)はoracle.jdbc.driver.T4CTTIoer.processErrorで oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) (で

に違反しましたT oracle.jdbc.driverでoracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)で oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)で4CTTIoer.java:331)。 でoracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:946) でoracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1169) でT4CStatement.doOall8(T4CStatement.java:207) edgelist.Edgelist.mainでoracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1273) (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 
) 

はここ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 
+0

使用することができますどのように適切に私たち 'PreparedStatement' –

+0

を重要学ぶくださいエラースタックの一部は 'ORA-00001:一意制約(PROJECT.SYS_C004002)違反です.'です。 –

答えて

0

が完全に動作するコードです:

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

/** 
* 
* @author Soumen 
*/ 
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=0,v1_chck=0,v2_chck=0; 
     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; 




     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((char) i == ' ') 
         { 
          ver1=num; 
          v1_chck=1; 
          num=""; 
         } 
         else 
         { 
          if((char) i == '\n') 
          { 
           ver2=num; 
           v2_chck=1; 
           num=""; 
          } 
         } 
        } 
        if(v1_chck==1 && v2_chck==1) 
        { 
         ++serial; 
         type=getRandomNumberInRange(1, 10); 

         s="insert into edges(serial_no, vertex1, vertex2, edge_type)" 
          +"values("+serial+", '"+ver1+"', '"+ver2+"', "+type+")"; 
         stmt.executeQuery(s); 


         v1_chck=0; 
         v2_chck=0; 
        } 

       } 
      }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.commit(); 
       con.close(); 
      } 
      catch(IOException e) 
      { 
       System.out.println(e); 
      } 
     } 


    } 
} 

あなたものPreparedStatement()関係のない、しかし

5

エラーはあなたがキーを持つ行を挿入しようとしていることを意味しますそれはあなたのテーブルにすでにあります。

あなたは SERIAL_NOに主キーを定義し、そのフィールドは、あなたの serial変数が移入されたが、それは if文の中だから問題は、あなたが常に serial=++c;を実行しないということです。

これは、同じserialの値を複数回挿入できることを意味します。そのため、エラーが発生しています。ここに私のロジックを編集した後

+0

解決策はおそらく、* every * insertの前にjava変数 'serial'をインクリメントすることです。代わりの解決策は、データベース列を使用してPK列を移入することです。あるいは、複合主体が '(serial_no、vertex1、vertex2)'である必要があるかどうかを考えてみてください。これは、OPだけが知っているビジネスルールになります。 – APC

関連する問題