# Oracle-DB mit Daten füllen



## naeko (15. Dezember 2006)

Hallo,

ich habe eine Access-DB bzw. eine CSV-Datei mit vielen Daten (ca.5000).
Jetzt möchte ich eine Oracle-DB mit diesen Daten füllen.
Leider hab ich in meinem Oracle SQL Developer keine Funktion gefunden, wo ich die Daten einfach so kopieren kann. Ich will die aber auch nicht händisch eintippen. Gibt es da irgendeine Möglichkeit?

Danke


----------



## Exceptionfault (15. Dezember 2006)

Es gibt natürlich sehr viele Möglichkeiten. Sehr elegant und schnell sind External Tables, allerdings nicht ganz so trivial um es in 2 Sätzen zu erklären. 

Wenn du aber schon vom SQL Developer sprichst, in der neusten Version 1.1.0.21 gibt es eine Importfunktion.
Rechte Maustaste auf die Tabelle in die du importieren willst => Import Data => Excel
Deine CSV Datei musst du vorher in Excel öffnen und eben auch als .xls Datei speichern. Die Reihenfolge der Spalten musst du entsprechend anpassen falls die alte und neue Tabelle abweichen.

Meld dich ob`s damit funktioniert hat, ansonsten probieren wirs mit External Tables bzw. dem SQL*Loader.

p.s. 5000 Sätze sind nicht viel ;-)


----------



## naeko (15. Dezember 2006)

wow.......das ging ja schnell. Danke für die Antwort, werde es demnächst dann ausprobieren:

nun ja 5000 Datensätze in eine DB händisch einzugeben dauert trotzdem lang

Vielleicht kannst du mir aber bei einem anderem Problem helfen:
Ich greife aus einer Java-Applikation auf Oracle-DB und bekomme (nach einer gewissen Zeit) folgende Fehlermeldung:
ORA-01000: Maximale Anzahl offener Cursor überschritten
Im google steht ich soll in der Datei "init.ora" Konfiguration anpassen (max_open_cursors erhöhen).
Leider greif ich auf die DB nicht lokal zu. Und selbst wenn ich diese Cursorzahl auf ein Maximum stellen werde, werd ich sie irgendwann mal erreichen.
Was sind denn diese Cursors?Und wie kann ich sie aus meiner Anwendung heraus schließen?


----------



## Thomas Darimont (16. Dezember 2006)

Hallo!



> Ich greife aus einer Java-Applikation auf Oracle-DB und bekomme (nach einer gewissen Zeit) folgende Fehlermeldung:
> ORA-01000: Maximale Anzahl offener Cursor überschritten


Dann würde ich mal sagen, dass in der Java Anwendung die verwendeten Cursor nicht geschlossen werden ... Wurde für die entsprechenden ((Prepared/Callable)Statement / ResultSet -Instanzen close() aufgerufen?

Gruß Tom


----------



## naeko (19. Dezember 2006)

also es läuft bei mir folgendermaßen:
es gibt eine Methode wo ich meine Info von ResultSets bekomme:


```
ResultSet res;
res = getDatenFromTableA();
res.next();
setFeldA(res.getString(1));
res = null;
res = getDatenFromTableB();
res.next();
setFeldB(res.getString(1));
res = null;
res = getDatenFromTableC();
//und so weiter.....am Schluss dann:
res.close();
```
dann in einer anderen Klasse Methoden mit eigentlichen Abfragen :

```
ResultSet getDatenFromTableA()
{
 ResultSet res = null;
 String sql = "SELECT BLABLABLA FROM BLABLA";
 try
 {
  res = getResult(connection, sql);
 }
 catch(SQLException e)
 {
  e.printStackTrace();
 }
 return res;
}
```
und im getResult steht:

```
ResultSet getResult(Connection connection, String sql) throws SQLException
{
 ResultSet res = null;

 if (connection != null)
 {
  Statement statement = connection.createStatement();

	if (statement.execute(sql))
	{
		res = statement.executeQuery(sql);
	}
 }
 else
	throw new SQLException("No Database connection available!");
		
return res;
}
```
Wo muss ich noch die Cursors schließen, ohne dass ich was an meiner Codestruktur ändern muss?


----------



## Exceptionfault (19. Dezember 2006)

Ich komm zwar mehr aus der .NET Welt, aber mir scheint du schliesst nirgends dein Resultset, sondern verwirfst einfach die Referenz darauf. res = null schliesst das Resultset nicht sofort, wahrscheinlich erst wenn der Garbage Collector die Resource wieder frei gibt zu der du nach dem NULL setzen keine Referenz mehr hast.
Besser ist es vor dem NULL setzen, explizit res.close(); aufzurufen.

( das wäre zumindest bei .NET meine Vermutung  )



naeko hat gesagt.:


> ```
> setFeldA(res.getString(1));
> res = null;
> res = getDatenFromTableB();
> ```


----------

