# unverständliches DB Problem (Es ist kein temporärer Systemtabellenbereich mit einer ausreichenden..)



## casi91 (2. Mrz 2012)

Hallo liebe Community.
Ich habe gerade eher Zufällig ein kleines Problem gehabt, welches ich zwar beheben konnte, mir aber unverständlich ist, warum es zuvor zu einem Fehler kam.

Kurz zur Anmerkung.
Ich arbeite mit Hibernate und Annotaitions 
und mit einer DB2 Datenbank

Nun das "Phänomen"
In meinem Programm hat sich irgendwann folgende SQL abfrage zusammengesetzt:

```
Select * from Tabelle where ID between 4711 and 4711
```
Bei dieser Abfrage bekam ich dann folgenden Fehler:

```
[IBM][CLI Driver][DB2/NT] SQL1585N  Es ist kein temporärer Systemtabellenbereich mit einer ausreichenden Seitengröße vorhanden.  sqlstate=54048
```

Wenn ich nun die Abfrage (wie es auch logischer ist) umstelle zu:

```
Select * from Tabelle where ID = 4711
```
kommt dieser Fehler nicht und alles ist in Butter.

Bei einer anderen Abfrage wie:

```
Select * from Tabelle where ID between 4710 and 4719
```
taucht kein Fehler auf.

(bitte nicht mit mir über den Sinn oder Unsinn bestimmter SQL-Abfragen diskutieren, habe es ja geändert, mir gehts nur um den Fehler und darum, dass ich nicht verstehe warum dieser dann auftritt)

Danke schonmal im Vorraus =)


----------



## x22 (2. Mrz 2012)

Weil du in deinem Code:


```
Select * from Tabelle where ID between 4711 and 4711
```


bei der Abfrage between nicht dieselbe ID stehen haben darfst.


----------



## California (3. Mrz 2012)

@x22:
mit allem gebotenen Respekt, das ist Bullshit. 
Ich hab's auf unserer AS getestet, und sie zeigt ganz klar den einen zutreffenden Satz an. Was sie nicht mag (die IBM DB2/400 auf der iSeries (oder AS400)), ist eine BETWEEN- Klausel, bei der das erste Argument größer ist als das zweite
(Also 
	
	
	
	





```
SELECT * FROM Tabelle WHERE ID BETWEEN 4712 AND 4711
```
). 
Hier kommt aber nur eine leere Menge zurück, und kein Fehler. Andere Datenbanken verhalten sich da kommutativ und geben dieselbe Ergebnismenge wie bei wertmäßig steigenden Argumenten zurück. Was da jetzt richtig oder falsch ist, ist wohl eine philosophische Frage. Blöd ist nur, dass sich wieder mal nicht alle DBs gleich verhalten. IMHO ist aber 8 genauso zwischen 5 und 10 wie zwischen 10 und 5...
Zurück zum Problem: Google mal den SQL- Fehler (SQL1585N), anscheinend kannst Du an ein paar Parametern drehen...
Und eine BETWEEN- AND- Abfrage mit gleichen Argumenten ist durchaus sinnvoll, wenn Du z.B. von- bis Lieferschein oder Kundennummer oder mit derselben Logik halt nur nach einem suchen willst. Also 

```
if (StringUtils.isBlank( bis )) {
    bis = von;
} // hier Abfrage
```
schreibt sich halt viel schneller als

```
if (StringUtils.isBlank( bis )) {
    // Abfrage nach einem Wert
} else {
    // Abfrage mit von- bis
}
```
Abgesehen davon, dass Du im zweiten Fall immer zwei Abfragen warten musst (redundanter Code!)

Geschätze 2/3 unserer ERP- Abfragen (zeige Auftrag / Lieferschein / xxx mit Datum usw. zwischen / und oder mit einem Wert) würden nicht funktionieren, wenn man bei BETWEEN AND keine gleichen Werte angeben dürfte. Die sind nämlich alle nach dem ersten Schema implementiert. Und es ist ein Glücksfall, dass menschliche Benutzer instinktiv (= zwanghaft) immer steigende Werte eingeben...


----------



## casi91 (5. Mrz 2012)

@California

Danke für deine ausführliche Antwort.
Damit der Fehler derzeit nicht auftaucht, habe ich den von dir geschriebenen (unsauberen) code auch schon verwendet.
Bedeutet ich frage derzeit via "if-then-else" ab und führe dann ein "between" oder ein "equal" aus.

Das sich nicht alle DB's gleich verhalten stimmt.
Ich habe gerade gesehen, dass ich vergessen habe etwas dazu zu schreiben.
(müsste es nun wieder testen aber)
wenn ich die DB2-Datenbank auf der AS/400 laufen habe und die Abfrage mache, bekomme ich kein Problem. 
Habe ich die DB2 (wie es derzeit aus Testgründen der Fall ist) lokal, bekomme ich dieses Problem.

Ich werde bei Gelegenheit den SQL-Fehler mal Googlen und schauen was sich machen lässt.

Ich werde meinen Code nun vorerst mal mit dem "if"-woraround belassen, damit meine Abfragen funktionieren. Mich aber bei Gelegenheit weiter mit diesem Problem auseinandersetzen.
(Denn meines Erachtens nach, sollte eine "between 1 and 1" auch funktionieren)


----------



## x22 (7. Mrz 2012)

Bei meinem Test wird die Between Klausel mit zwei gleichen Werten nicht compiled.
Aber wenn das Problem anders gelöst wurde, ist ja gut.
Freundlicher könnte man es dennoch ausdrücken.


----------



## California (9. Mrz 2012)

x22 hat gesagt.:


> Bei meinem Test wird die Between Klausel mit zwei gleichen Werten nicht compiled.
> Aber wenn das Problem anders gelöst wurde, ist ja gut.
> Freundlicher könnte man es dennoch ausdrücken.



Sorry, war vielleicht etwas schnodderig ;-)
Ändert nichts daran, dass die Ansage, die Werte bei BETWEEN- AND- dürfen nicht gleich sein, nicht stimmt, zumindest für SQL.
Da darf der Server oder die Verbindung nicht abschmieren.
Solange die Werte typkompatibel sind, darf auch keine Fehlermeldung kommen, sondern eine leere Ergebnismenge, wenn nichts gefunden wird.
Habe auch mal nachgelesen, im Standard ist BETWEEN- AND- anscheinend nicht kommutativ für die Argumente, die sollen ansteigend sein, das finde ich aber unlogisch. Naja, ist einfacher zu implementieren..

Was meinst Du mit "Im meinem Test nicht compiled" ? Wo kompilierst Du das SQL- Statement?


----------

