# ResultSet#next Ungültige Reihenfolge (DB2)



## The_S (21. Jan 2008)

Hallo zusammen,

Ich möchte bestimmte Daten (die über mehrere Tabellen verteilt sind) in die selbe Tabelle kopieren - nur mit einer neuen ID. Grundsätzlich erledige ich das so (vereinfachter SQL):


```
INSERT INTO tbl1 (spalte1, spalte2, spalte3) (SELECT spalte1, spalte2, 5 FROM tbl1 WHERE spalte3=2 ORDER BY spalte3)
```

Funktioniert auch soweit, wie es soll - Es werden alle Datensätze, bei denen spalte3 = 2 ist mit einer neuen ID nochmal in die Tabelle geschrieben und der Wert in spalte3 durch "5" ersetzt.

Spalte3 ist nicht eindeutig, es kann also vorkommen, dass in tbl1 mehrere Datensätze existieren, die in der spalte3 auf "2" stehen. Soweit auch kein Problem, funktioniert Reibungslos. Nur jetzt ist noch eine zweite Tabelle mit dieser Tabelle über eine eindeutige ID verknüpft, in welcher natürlich auch noch die entsprechenden Daten kopiert werden müssen. Da ich jetzt zum kopieren die IDs aus der 1. Tabelle benötige, habe ich mir gedacht, ich mache folgendes:


```
PreparedStatement ps = con.prepareStatement("SELECT id FROM tbl1 WHERE spalte3=2 ORDER BY id");
ResultSet rs = ps.executeQuery();
ps = con.prepareStatement("SELECT id FROM tbl1 WHERE spalte3=5 ORDER BY id");
ResultSet rs2 = ps.executeQuery();
while (rs.next() && rs2.next()) {
   ps = con.prepareStatement("INSERT INTO tbl2 (spalte1, spalte2, verkn_mit_tbl1 ) (SELECT spalte1, spalte2, " + rs2.getInt("id") + "  FROM tbl2 WHERE verkn_mit_tbl1=" + rs.getInt("id") + ")");
   ps.execute();
}
```

Der 1. Datensatz wird auch ohne Probleme eingetragen, aber beim 2. Durchlauf (in tbl1 wurden 2 Datensätze kopiert) wird bei rs.next() folgende Exception geworfen:



> COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver] CLI0125E  Ungültige Reihenfolge für Funktion. SQLSTATE=HY010



und ich hab kA warum.

Weiß da jemand Rat?

Danke!


----------



## maki (21. Jan 2008)

Hmmm.. kann sein das ich daneben liege, aber werden alte ResultSets nicht geschossen wenn du mit demselben PrepareStatement ein neues erzeugst?

Was passiert, wenn du 2 PreparedStatements verwendest, also eines pro zu  erzeugendem ResultSet?


----------



## az (21. Jan 2008)

Hallo,

maki hat recht, pro Statement gibts nur ein ResultSet.


----------



## The_S (21. Jan 2008)

Sollte eigentlich nicht der Fall sein, hat bis jetzt noch nie Probleme bereitet  .

Hab jetzt mal für jedes ResultSet und für den Insert in der Schleife ein eigenes PreparedStatement verwendet => selbes Resultat. Aber danke für deine Hilfe  .


----------



## The_S (21. Jan 2008)

Neue Erkenntnis:

Wenn ich das Insert-Statement in der while-Schleife weglasse, dann funktionierts - also zumindest bekomme ich keine Fehlermeldung mehr. Warum ist mir aber nach wie vor ein Rätsel => es spielt keine Rolle ob ich 3 PreparedStatements verwende oder nur eines und ich greife ja auch bei den selects auf eine andere Tabelle zu, wie bei dem Insert ???:L .


----------



## The_S (21. Jan 2008)

OK, wenn ich die Statements in der while-Schleife alle in eine ArrayList schreibe und erst anschließend in einer zweiten Schleife alle Statements in der ArrayList ausführe, dann funktioniert das ohne Probleme (auch mit nur einem einzelnen PreparedStatement).

Dennoch würde mich "das Warum" interessieren.

Danke!

(unter vorbehalt abhakt)


----------

