Das kann doch nicht char sein!

on

Was mich und auch den coachenden Trainer schon die ganze Entwicklungszeit lang geärgert hat, war dass es zum Thema SimpleJDBC und Spring noch seeeehr wenig Beispiele oder Erklärungen im Netz gibt. Dabei sind fast 3 Jahre, die es Spring 2.0 schon gibt, doch eine lange Zeit in der IT.

Und so waren wir bei den meisten Problemen dann irgendwie sehr allein gelassen und haben uns das eine oder andere Mal gefragt, ob so ein grundlegendes Problem, wie zum Beispiel das Prefix-Mapping beim Marshalling, einfach noch nie irgendjemand hatte und warum, wie beim Prefix-Mapping, Funktionen teilweise schon vom Framework gesperrt werden.

In diese Kategorie dürfte wohl auch das Problem mit der Oracle-Datenbank fallen und wie ich mitbekommen habe hier im Haus, dürften wir da auch nicht die einzigen sein die da stutzen mussten. Oder eben in diesem Fall verlängern.

Was hatten wir eigentlich vor? Nichts spektakuläres. Nur ein Select-Statement auf die Oracle-Datenbank.

Etwas simples wie

SELECT feld1, feld2 FROM oraDB WHERE id = '12345'

Da wir aber mehr Kunden haben als nur Kunde 12345, sollte das ganze dynamischer werden. Man kann das über PreparedStatements machen oder eben, wie in unserem Fall, über SimpleJBDCTemplate:

String SQL_STATEMENT = "SELECT feld1, feld2 FROM oraDB WHERE id = ?";

List <Foobar> foobarList  = getSimpleJdbcTemplate().query(SQL_STATEMENT, new SelectRowMapper(), kundennr);

kundennr wurde freundlicherweise beim Funktionsaufruf schon als String übergeben. Was passiert war, dass das handgeschriebene SQL-Statement zwar funktionierte, sowohl von außen über ein DB-Tool wie auch aus der Anwendung heraus wenn die Query ohne zusätzliche Parameter ausgeführt wurde. Aber als PreparedStatement nicht zu retten war.

Des Rätsels Lösung war dann, dass Char-Felder in Oracle dazu neigen bei PreparedStatements auf einmal pingelig zu werden. Bitte genau die Zeichenzahl oder es wird nichts gefunden.

Alternative Lösungsvorschläge:

Aus dem Char ein VarChar2 machen, was zur Zeit die preferierte Lösungsvariante für mehrere Felder ist

oder

sich der org.apache.commons.lang.StringUtils bedienen und sich dort auf die Funktionen padLeft und padRight verlassen, die die Zeichenketten dann entsprechend auffüllen.

Woher das Problem kommt? Die Datenbank wurde von jemand entworfen, der aus dem DB2- und Host-Bereich kommt, wo dieses Problem vielleicht eine untergeordnete Rolle spielt. Da aber in diesem Fall eine begrenzte Entwickleranzahl mit Java drauf zugreift wird wohl das Umstellen die Lösung sein.

2 Kommentare

  1. Madse sagt:

    Aha. Also Problem geloest?

  2. hazamel sagt:

    Per Workaround erstmal gelöst und der echte Lösungsansatz steht noch aus.

Kommentare sind geschlossen.