# ORA-00911: invalid character



## LexeB4F (10. Jan 2016)

Hi Leute,

Ich habe echt lange versucht das Problem zu lösen... gesucht bei google usw.
Hoffe hier kann mir jemand helfen!


```
String sqlInsert1 = "Insert into TEST.PLANBLATT(MAPERSID,MONAT,JAHR) values ";
                    String sqlInsert2 = "";
                    for (int testZähler = 0; testZähler <= anzahlMA - 1; testZähler++){
                        if (MaP[testZähler] != null){
                        sqlInsert2 = sqlInsert2 + sqlInsert1 + "('"+MaP[testZähler]+"','" +IntMonat +"','" +Jahr +"');";
                        }
                    }
                    //sqlInsert2 = sqlInsert2.substring(0, sqlInsert2.length()-1);
                    String sql = sqlInsert2;
                  
                    System.out.println(sql);  
                    new DB_Eintrag(sql);
```

So sieht der String als Bsp. als System.out.println(sql);:

```
Insert into TEST.PLANBLATT(MAPERSID,MONAT,JAHR) values ('007','12','2016');Insert into TEST.PLANBLATT(MAPERSID,MONAT,JAHR) values ('016','12','2016');
```

Fehlermeldung bekommen ich diese:
java.sql.SQLSyntaxErrorException: ORA-00911: invalid character

Was ist hier Falsch!?

Ach ja... und wenn ich den String in der Datenbank ausfüher geht es einwandfrei.
Datenbank: Oracle SQL XE

DB_Eintrag(); funktioniert an anderen stellen auch einwandfrei. An dieser kann es nicht liegen...

Thx


----------



## stg (10. Jan 2016)

Es wäre trotzdem interessant zu sehen, was "DB_Eintrag" macht. Denn in deinem hier geposteten Code erstellst du ja einfach irgendwelche Strings und man sieht nichts bzg Datenbankkommunikation usw. Daher rate ich einfach mal:

Problem ist offenbar das abschließende ";", welches du mit in dein statement schreibst.
Wenn du mehrere insert statements absetzen willst, dann mach das entweder nacheinander oder in einem batch.


----------



## LexeB4F (10. Jan 2016)

Danke für die rasche Antwort.
Es war wirklich das ";"... 
Die Statments nacheinander zu senden ist nicht wirklich elegant -.- (finde ich zumindest; oder bin ich damit falsch?)
und das mit dem batch verstehe ich leider nicht...
Würde es damit denn gehen?

Oder gibt es noch eine andere Lösung mehrere inserts gelichzeitig abzusetzen?


----------



## stg (10. Jan 2016)

Dazu müsste man wissen, was genau du bisher machst, um deine Statements abzusetzen. 

Mit dem batch bezog ich mich hier drauf:
https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#executeBatch()


----------



## LexeB4F (10. Jan 2016)

Ich übergebe ganz einfach einen String and die DB_Eintrag...
der rest macht doch JPA...

Hilft es wenn ich die DB_Eintrag poste?


```
package db__Connection;

//STEP 1. Import required packages
import java.sql.*;

import javax.swing.JOptionPane;

public class DB_Eintrag {

    // JDBC driver name and database URL
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:oracle:thin:@localhost:1521:XE";

    // Database credentials
    static final String USER = "Test";
    static final String PASS = "test";
    // Deklaration der Ausgabewerte

    public DB_Eintrag(String sql) {
        // TODO Auto-generated constructor stub
        Connection conn = null;
        Statement stmt = null;
        try {
            // STEP 2: Register JDBC driver
            Class.forName("oracle.jdbc.driver.OracleDriver");

            // STEP 3: Open a connection
            // System.out.println("Connecting to database...");
            conn = DriverManager.getConnection(DB_URL, USER, PASS);

            // STEP 4: Execute a query
            // System.out.println("Creating statement...\n");
            stmt = conn.createStatement();
            stmt.executeQuery(sql);

            stmt.close();
            conn.close();
            // System.out.print("0");
        } catch (SQLException se) {
            // Handle errors for JDBC
            se.printStackTrace();
            JOptionPane.showMessageDialog(null, "Fehler \nEingabefehler");
        } catch (Exception e) {
            // Handle errors for Class.forName
            e.printStackTrace();
            System.out.print("2");
        } finally {
            // finally block used to close resources
            try {
                if (stmt != null)
                    stmt.close();
            } catch (SQLException se2) {
                System.out.print("3");
            } // nothing we can do
            try {
                if (conn != null)
                    conn.close();
            } catch (SQLException se) {
                se.printStackTrace();
                System.out.print("4");
            } // end finally try
        } // end try
    }// end main
}
```


----------



## LexeB4F (10. Jan 2016)

Danke für den hinweis mit dem batch, dass scheint mir doch die Lösung zu sein für mein Problem 
Muss mich nur noch genau einlesen wie ich das machen muss.  THX!


----------



## stg (10. Jan 2016)

JPA hat nix mit all dem, was du bisher gepostet hast, zu tun. 

Zu deinem Ansatz aber noch ein paar Grundsätzliche Dinge:
Du verwendest für deine Insert-Statements die Methode "executeQuery". Diese gibt aber ein ResultSet zurück. Was soll denn die Antwort bei einem Insert sein? Bei einem schreibenden Zugriff solltest du executeUpdate verwenden. Siehe dazu u.A. hier: https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#executeUpdate(java.lang.String)
Wenn du einen Query absetzen willst, erstellst du ein Objekt vom Typ DB_Eintrag. Aber wozu? Was machst du anschließend damit? Außerdem bekommst du in deinem Code doch gar nichts mehr davon mit, wenn das Schreiben fehlgeschlagen ist. Ich denke mal, dass das nicht deine Intention dabei war.


----------



## LexeB4F (10. Jan 2016)

Sorry JPA ist ja das zeugs mit hibernate, ec..link,  usw...

Hey aber dank für deine Hilfe....  habe schon wieder sehr viel dazugelernt!

Ich verwende jetzt "updateQuery" 
Ich kann jetzt mehrere" Insert into mit addBatch verarbeiten. 
Falls du noch weitere Fehler/Unschönheiten in meinen Code entdeckt hast, bin ich froh wenn ich die kenne.
Ich will ja nichts Falsches lernen.

Besten Dank stg für deine Hilfe!

So sieht jetzt mein Code aus:

```
String sqlInsert1 = "Insert into TEST.PLANBLATT(MAPERSID,MONAT,JAHR) values ";
                    String sqlInsert2 = "";
                    int i = 0;
                    int anzahlMAtoPB = 0;
                                      
                    for (int testZähler = 0; testZähler <= anzahlMA - 1; testZähler++){
                        if (MaP[testZähler] != null){
                        anzahlMAtoPB++;
                        }
                    }
                    String[] sqlbatch = new String[anzahlMAtoPB];
                  
                    for (int testZähler = 0; testZähler <= anzahlMA - 1; testZähler++){
                      
                        if (MaP[testZähler] != null){
                        sqlbatch[i] = sqlInsert2 + sqlInsert1 + "('"+MaP[testZähler]+"','" +IntMonat +"','" +Jahr +"')";
                        i++;
                        }
                    }
                    /*for (int testZähler = 0; testZähler <= anzahlMAtoPB - 1; testZähler++){
                    System.out.println(sqlbatch[testZähler]);
                    }
                    */
                    new DB_BatchEintrag(sqlbatch);
```


```
package db__Connection;

//STEP 1. Import required packages
import java.sql.*;

import javax.swing.JOptionPane;

public class DB_BatchEintrag {

    // JDBC driver name and database URL
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:oracle:thin:@localhost:1521:XE";

    // Database credentials
    static final String USER = "Test";
    static final String PASS = "test";
    // Deklaration der Ausgabewerte

    public DB_BatchEintrag(String[] sqlbatch) {
        // TODO Auto-generated constructor stub
        Connection conn = null;
        Statement stmt = null;
        try {
            // STEP 2: Register JDBC driver
            Class.forName("oracle.jdbc.driver.OracleDriver");

            // STEP 3: Open a connection
            // System.out.println("Connecting to database...");
            conn = DriverManager.getConnection(DB_URL, USER, PASS);

            // STEP 4: Execute a query
            // System.out.println("Creating statement...\n");
            stmt = conn.createStatement();
                      
            for (String query : sqlbatch){
                stmt.addBatch(query);
            }
            stmt.executeBatch();
            stmt.close();
            conn.close();
            // System.out.print("0");
        } catch (SQLException se) {
            // Handle errors for JDBC
            se.printStackTrace();
            JOptionPane.showMessageDialog(null, "Fehler \nEingabefehler");
        } catch (Exception e) {
            // Handle errors for Class.forName
            e.printStackTrace();
            System.out.print("2");
        } finally {
            // finally block used to close resources
            try {
                if (stmt != null)
                    stmt.close();
            } catch (SQLException se2) {
                System.out.print("3");
            } // nothing we can do
            try {
                if (conn != null)
                    conn.close();
            } catch (SQLException se) {
                se.printStackTrace();
                System.out.print("4");
            } // end finally try
        } // end try
    }// end main
}// end FirstExample
```


----------

