# Warum kein Update bzw. Delete möglich



## fenerli23 (6. November 2007)

hi,

bin soeben ein Beispielcode durchgegangen und habe da festgestellt das alle SELECT Anweisungen funktionieren.
Jedoch wollte ich danach ein Update bzw. Delete ausführen doch es tritt die Fehlermeldung auf :


```
java.sql.SQLException: ORA-00900: Ungültige SQL-Anweisung
```

Meine Frage warum kann ich mit diesem Code keine Update bzw. Delete Anweisung ausführen muss dazu etwas umgeändert werden?

Danke

```
public class DbTableUpdate
{
	  public static void main( String[] argv )
	  {
	    String sDbDrv=null, sDbUrl=null, sTable=null, sUsr="", sPwd=""; String sSql   = "";
	    if( 3 <= argv.length ) {
	      sDbDrv = argv[0];
	      sDbUrl = argv[1];
	      sTable = argv[2];
	      //if( 4 <= argv.length )  
	      sUsr = argv[3];
	      //if( 5 <= argv.length )  
	      sPwd = argv[4];
	    } else {
	      try {
	        BufferedReader in = new BufferedReader(
	                            new InputStreamReader( System.in ) );
	        System.out.println( "Name des Datenbanktreibers eingeben (z.B. oracle.jdbc.driver.OracleDriver):" );
	        sDbDrv = in.readLine();
	        System.out.println( "Url der Datenbank eingeben (z.B. jdbc:oracle:thin:@localhost:1521:xe):" );
		    sDbUrl = in.readLine();
		    System.out.println( "Name der Tabelle eingeben (z.B. MeineTestTabelle):" );
		    sTable = in.readLine();
		    System.out.println( "Benutzername (z.B. root):" );
	        sUsr = in.readLine();
	        System.out.println( "Passwort (z.B. mysqlpwd):" );
	        sPwd = in.readLine();
	        if( null != sTable && 0 <  sTable.length() &&
	        	       (null == sSql   || 0 == sSql.length())  )
	        	      sSql = "UPDATE" +sTable+ "SET " ;
	        System.out.println( "SQL Befehl:" );
	        sSql = in.readLine();
	        
	      } catch( IOException ex ) {
	        System.out.println( ex );
	      }
	    }
	    if( null != sDbDrv && 0 < sDbDrv.length() &&
	        null != sDbUrl && 0 < sDbUrl.length() &&
	        null != sTable && 0 < sTable.length() ) {
	      Connection cn = null;
	      Statement  st = null;
	      ResultSet  rs = null;
	      try {
	        // Select fitting database driver and connect:
	        Class.forName( sDbDrv );
	        cn = DriverManager.getConnection( sDbUrl, sUsr, sPwd );
	        st = cn.createStatement();
	        rs = st.executeQuery( sSql );
	        // Get meta data:
	        ResultSetMetaData rsmd = rs.getMetaData();
	        int i, n = rsmd.getColumnCount();
	        // Print table content:
	        for( i=0; i<n; i++ )
	          System.out.print( "+---------------" );
	        System.out.println( "+" );
	        for( i=1; i<=n; i++ )    // Attention: first column with 1 instead of 0
	          System.out.print( "| " + extendStringTo14( rsmd.getColumnName( i ) ) );
	        System.out.println( "|" );
	        for( i=0; i<n; i++ )
          System.out.print( "+---------------" );
	        System.out.println( "+" );
	        while( rs.next() ) {
	          for( i=1; i<=n; i++ )  // Attention: first column with 1 instead of 0
	            System.out.print( "| " + extendStringTo14( rs.getString( i ) ) );
	          System.out.println( "|" );
	        }
	        for( i=0; i<n; i++ )
	          System.out.print( "+---------------" );
	        System.out.println( "+" );
	      } catch( Exception ex ) {
	        System.out.println( ex );
	      } finally {
	        try { if( null != rs ) rs.close(); } catch( Exception ex ) {}
	        try { if( null != st ) st.close(); } catch( Exception ex ) {}
	        try { if( null != cn ) cn.close(); } catch( Exception ex ) {}
	      }
	    }
	  }
	  
	  // Extend String to length of 14 characters
	  private static final String extendStringTo14( String s )
	  {
	    if( null == s ) s = "";
	    final String sFillStrWithWantLen = "              ";
	    final int iWantLen = sFillStrWithWantLen.length();
	    final int iActLen  = s.length();
	    if( iActLen < iWantLen )
	      return (s + sFillStrWithWantLen).substring( 0, iWantLen );
	    if( iActLen > 2 * iWantLen )
	      return s.substring( 0, 2 * iWantLen );
	    return s;
	  }
}
```


----------



## Ronin-Jay (6. November 2007)

Hallo fenerli23,

1.)  Hast Du Dir mal die entsprechenden Statements ausgeben lassen?
2.) Hier fehlt hinter Update ein Leerzeichen:


> if( null != sTable && 0 <  sTable.length() &&
> (null == sSql   || 0 == sSql.length())  )
> sSql = "UPDATE" +sTable+ "SET " ;
> System.out.println( "SQL Befehl:" );
> sSql = in.readLine();



3.)  Was machst Du in dem oben zitierten Source? Wenn ne Bedingung erfüllt ist, belegst Du sSql..... anschließend überschreibst Du sSQL mit etwas Eingegebenem von der Konsole....


----------



## fenerli23 (6. November 2007)

Also erstmal danke für deine Antwort ...

nun nochmal zum Problem, dieser Source gibt alle Select Anweisungen aus ich jedoch will ein Update bzw. Delete ausführen doch dann tritt immer wieder der Fehler auf von dem ich gesprochen habe...

Fehlermeldung:
	
	
	



```
java.sql.SQLException: ORA-00900: Ungültige SQL-Anweisung
```

Mein Ziel ist es nun ein Update bzw Delete zu erstellen in dem eine willkürliche Eingabe erfolgt. Nun würde ich gerne wissen warum dies mit diesem Source erstmal nicht möglich ist bzw. nicht klappt ...


----------



## Ronin-Jay (6. November 2007)

Dann noch mal zu meiner Frage: Hast Du Dir die rsultierenden Statements mal ausgeben lassen!? Denn die Fehlermeldung, die Du erhälst, bedeutet, das das Statement falsch ist.....


----------



## fenerli23 (6. November 2007)

versteh nicht was du ganz genau meinst denn die Select anweisungen gingen alle...


----------



## Kulabac (6. November 2007)

Wie Ronin-Jay schon geschrieben hat:

Lass dir mal das SQL-Statement ausgeben bevor du es abschickst. Und wenn es nicht funktioniert und du es nicht verstehst, poste hier nochmal die abgeschickten Statements.


----------



## Ronin-Jay (6. November 2007)

Dann lies mal weiter oben....
In einer Zeile belegst Du sSql mit Update.... da fehlt ein Leerzeichen "UPDATE,_,".

Danach belegst Du sSql aber gleich mit einem String von der Konsole, d.h. Du überschreibst ihn.
Setz mal ein System.out.println(sSql); ein, dann siehst Du, daß der String nicht richtig ist, außer Du gibst Ihn noch mal komplett über die Konsole ein.

Hier: http://www.tutorials.de/forum/java/280167-verbindungsprobleme-mit-oracle-datenbank-2.html hatte ich Dir doch schon eine Klasse bzgl Datenbank-Zugriffen gezeigt. Damit kannst Du sowohl Abfragen, als auch DELETES und UPDATES durchführen...


----------



## fenerli23 (7. November 2007)

hi habe jetzt das mal so gemacht, d.h den Befehl von der Console eingelesen jedoch tritt immer noch die gleiche Fehlermeldung auf ... stimmt das so nicht?


```
if( null != sTable && 0 <  sTable.length() &&
	        	       (null == sSql   || 0 == sSql.length())  )
	        	     // sSql = "UPDATE employees SET SALARY = SALARY * 1.08 WHERE JOB_ID='IT_PROG'" ;
	        System.out.println(" SQL Befehl: " );
	        sSql = in.readLine();
```


----------



## Ronin-Jay (7. November 2007)

Setz mal bitte nach Deinem 

```
sSql = in.readLine();
```

ein 

```
System.out.println(sSql);
```
in den Source und dann poste das Ergebnis mal bitte hier.


----------



## fenerli23 (7. November 2007)

Habe das mal so gemacht wie du es mir beschrieben hast hier das ergebnis...


```
SQL Befehl: 
Update Employees Set salary=8520 Where Employee_ID = 120
Update Employees Set salary=8520 Where Employee_ID = 120
java.sql.SQLException: ORA-00900: 
Ungültige SQL-Anweisung
```

d.h er gibt das Aus was ich auch eingebe jedoch führt er es leider nicht aus


----------



## Ronin-Jay (7. November 2007)

Hmmm, was mir gerade auffällt:
Im oben geposteten Quellcode von Dir nutzt Du:

```
rs = st.executeQuery( sSql );
```

Diese Zeile nutzt Du auch mit einem Update, wenn ich das richtig sehe. Für ein Update mußt Du aber meines Wissens nach auf:

```
executeUpdate(String)
```
zurückgreifen....


----------



## fenerli23 (7. November 2007)

oh das könnte es sein jedoch habe ich das eben mal ausgeführt d.h diese Änderung vorgenommen:


```
st.executeUpdate( sSql );
```

jetzt tritt dieser Fehler auf:


```
java.lang.NullPointerException
```


----------



## Ronin-Jay (7. November 2007)

Poste mal bitte die komplette Fehlermeldung.
Diese besagt, daß ein Object auf welches Du zugreifst null ist.


----------



## fenerli23 (7. November 2007)

Ich habe eben mal nachgeschaut das Update wird jetzt so ausgeführt  
auch wenn diese Fehlermeldung auftritt

```
SQL Befehl: 
Update employees Set Geb_Id = '10.01.1983' Where Last_Name = 'Kies'
Update employees Set Geb_Id = '10.01.1983' Where Last_Name = 'Kies'
java.lang.NullPointerException
```

danke nochmal

jetzt noch Insert und Delete ...


----------



## fenerli23 (7. November 2007)

Hi,

habe das mit dem Insert und Delete jetzt auch hinbekommen dank dir nochmal Ronin Jay


----------

