# Update auf Oracle Datenbank mit JDBC



## fenerli23 (30. Oktober 2007)

hi an alle,

habe soeben dieses Programm geschrieben um ein Update auf meiner Datenbank zu erstellen jedoch werden die Werte dier erstellt werden irgendwie nicht gespeichert ... müsste ich dazu noch etwas ergänzen:


```
package update;

import java.sql.*;

import oracle.jdbc.driver.*;
import oracle.sql.*;


class GetUpdate extends Object 
{
	public static void setGehalt(int manager_id, int salary)
	{
		try
		{
			DriverManager.registerDriver(new OracleDriver());
			Connection conn = DriverManager.getConnection(
					"jdbc:oracle:thin:@localhost:1521:xe", "hr", "fenerium");
			String sqlUpdate = "UPDATE employees SET Salary = ? WHERE manager_id = ?";
			PreparedStatement pstmt = conn.prepareStatement(sqlUpdate);
			pstmt.setInt(1, salary);
			pstmt.setInt(2, manager_id);
			pstmt.executeUpdate();
			conn.close();
			pstmt.close();
		}
		catch (Exception e)  
		{
			e.printStackTrace();
		}
	}
	
	public static void main (String[] args)
	{
		setGehalt(7201, 100);
	}
}
```


----------



## Tobias Köhler (30. Oktober 2007)

Also bei mir klappt es so:

```
try
		{				
			DriverManager.registerDriver(new OracleDriver());
			Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "hr", "hr");
	        
	        Statement stmt = conn.createStatement();	        
	        String sql = "UPDATE EMPLOYEES SET FIRST_NAME='Tobias' WHERE EMPLOYEE_ID=100";
	        stmt.execute(sql);
	        
	        logger.info("UPDATE durchgeführt");
	        
	        sql = "SELECT * FROM EMPLOYEES ORDER BY EMPLOYEE_ID";
	        ResultSet rSet = stmt.executeQuery(sql);
	        
	        while (rSet.next())	        
	        	logger.info("EMPLOYEE_ID: " + rSet.getInt("EMPLOYEE_ID") + " - " + rSet.getString("FIRST_NAME"));	        
	        
	        rSet.close();
	        stmt.close();
	        conn.close();
		}
		catch(SQLException e)
		{
			logger.error("Konnte keine Verbindung herstellen.", e);
		}
```


----------



## fenerli23 (30. Oktober 2007)

bei mir klappt es jetzt auch hatte versehentlich manager_id und salary verwechselt.

bei deinem code wundert mich das:

```
logger.info(".....")
```
das kenne ich gar nicht muss dazu etwas importieren vorher?


----------



## Tobias Köhler (30. Oktober 2007)

Tut hier eigentlich nix zur Sache. Such mal nach Log4J, daher kommt das. Ersetzt letztendlich die System.out.println-Einträge. Somit kannst du später, wenn ein Programm "in Betrieb genommen wird" und ein Fehler auftritt, leichter debuggen, da du zB einfach nur den Writer änderst und die Konsolenausgaben auf eine Datei umleitest.


----------



## fenerli23 (30. Oktober 2007)

kannst du mal hier nachschauen was falsch ist wollte einen neuen Employee einfügen:


```
import java.sql.*;

import oracle.jdbc.driver.*;
import oracle.sql.*;

public class GetInsert 
{

	public static void main(String[] args)
	{
		
		try        
		{   
			DriverManager.registerDriver(new OracleDriver());            
			Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "hr", "fenerium");                        
			Statement stmt = conn.createStatement();   
			
			//Hinzufügen eines neuen Arbeitnehmer
			/*(EMPLOYEE_ID, FIRST_NAME, LAST_NAME, " +
			"EMAIL, HIRE_DATE, JOB_ID, GEB_ID, DEPARTMENT_ID, SALARY)" +
			"PHONE_NUMBER, MANAGER_ID" + */
			String insertQuery = "INSERT INTO employees VALUES" +
					"(211, 'Hans','Wurstl', 'wurst', '01.10.2007', " +
					"'AC_SPEZ','29.08.1985', 80, 7500, '06131/21212', 101)";
			
			stmt.executeUpdate(insertQuery);
			System.out.println("INSERT durchgeführt");
			insertQuery = "SELECT * FROM EMPLOYEES ORDER BY EMPLOYEE_ID";
			ResultSet rSet = stmt.executeQuery(insertQuery);
			while (rSet.next())
				System.out.println("MANAGER_ID: " + rSet.getInt("MANAGER_ID") + " - " + rSet.getString("SALARY") + " - " +rSet.getString("LAST_NAME"));                                   
			rSet.close();            
			stmt.close();            
			conn.close();        
		}        
		catch(SQLException e)        
		{            
			System.err.println("error messgae: " + e.getMessage());
			e.printStackTrace();
			Runtime.getRuntime().exit(1);       
		} 
	}
}
```


----------



## zerix (30. Oktober 2007)

Hallo,

was passiert denn?

Hast du es schon mal mit 
	
	
	



```
connection.commit();
```
?

MFG

zEriX


----------



## Tobias Köhler (30. Oktober 2007)

Was genau wird denn für ein Fehler ausgegeben?
Ich finde eigenartig:
Employee ID = 211 -> Ist Employee ID nicht Primary Key und du musst den gar nicht setzen?
Email ist glaub ich unwichtig
JOB_ID: Muss das nicht eine Zahl sein?


----------



## fenerli23 (30. Oktober 2007)

diese geschieht:


```
error messgae: ORA-00917: Komma fehlt

java.sql.SQLException: ORA-00917: Komma fehlt

	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)
	at 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)
	at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1169)
	at oracle.jdbc.driver.OracleStatement.executeUpdateInternal(OracleStatement.java:1615)
	at oracle.jdbc.driver.OracleStatement.executeUpdate(OracleStatement.java:1580)
	at insert.GetInsert.main(GetInsert.java:28)
```


----------



## Tobias Köhler (30. Oktober 2007)

Woher kommt das "Komma fehlt"?^^ Seh ich nciht


----------



## fenerli23 (30. Oktober 2007)

ich auch nicht ich shcau mal jetzt nochmal gründlcih drüber mal schauen ob ich es finden werde...


----------



## fenerli23 (30. Oktober 2007)

den Kommafehler habe ich nun behoben jetzt kriege ich diese Fehlermeldung:


```
error messgae: ORA-00947: Anzahl der Werte reicht nicht aus

java.sql.SQLException: ORA-00947: Anzahl der Werte reicht nicht aus

	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)
	at 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)
	at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1169)
	at oracle.jdbc.driver.OracleStatement.executeUpdateInternal(OracleStatement.java:1615)
	at oracle.jdbc.driver.OracleStatement.executeUpdate(OracleStatement.java:1580)
	at insert.GetInsert.main(GetInsert.java:38)
```

so sieht die Tabelle aus:
CREATE TABLE  "EMPLOYEES" 
	"EMPLOYEE_ID" NUMBER(6,0), 
	"FIRST_NAME" VARCHAR2(20), 
	"LAST_NAME" VARCHAR2(25) CONSTRAINT "EMP_LAST_NAME_NN" NOT NULL ENABLE, 
	"EMAIL" VARCHAR2(25) CONSTRAINT "EMP_EMAIL_NN" NOT NULL ENABLE, 
	"PHONE_NUMBER" VARCHAR2(20), 
	"HIRE_DATE" DATE CONSTRAINT "EMP_HIRE_DATE_NN" NOT NULL ENABLE, 
	"JOB_ID" VARCHAR2(10) CONSTRAINT "EMP_JOB_NN" NOT NULL ENABLE, 
	"SALARY" NUMBER(8,2), 
	"COMMISSION_PCT" NUMBER(2,2), 
	"MANAGER_ID" NUMBER(6,0), 
	"DEPARTMENT_ID" NUMBER(4,0), 
	"GEB_ID" DATE


----------



## torax13 (1. November 2007)

```
String insertQuery = "INSERT INTO employees VALUES" +
					"(211, 'Hans','Wurstl', 'wurst', '01.10.2007', " +
					"'AC_SPEZ','29.08.1985', 80, 7500, '06131/21212', 101)";
```
Ganz schlechter Stil 

Verwende bitte IMMER die Schreibweise 'insert into tabelle (spalte1, spalte2) values (value1, value2)'

Warum? Zum einen wird der Code lesbar (woeher weiß ich den sonst welcher Wert in welche Spalte geht, ohne mir nebenbei die Tabellendefinition anzuschauen.

Zuma anderen, könnte mal jemand auf die Idee kommen Spalten hinzuzufügen / entfernen.. An die Effekte die dann auftreten wag ich lieber nicht zu denken.

Noch ein Hinweis: gib immer expiziet das Format von Datumswerten an (to_data('datum', 'format'). Warum? Nun, die Software könnte mal auf eine Datenbank tereffen, wo die NLS Parameter anders eingestellt sind.

Mit Tip 1 sollte sich auch Dein Problem einkreisen lassen.

achja, noch ein Tipp:
Mach das close() der Statements und Connection im finally{} Block. Sonst bleiben Sessions in der DB offen, wenn doch mal nen Fehler Auftritt....


----------

