Montag, 18. Januar 2010

Oracle Application Express - Probleme mit Umlauten (Windows 7)

Ich habe auf einem Windows 7 (64bit) die Oracle XE Datenbank installiert.

Die Installation lief problemlos. Danach habe ich wie in dem Buch "Oracle Apex und XE" beschrieben die Installation von Apex 3.2.1 ausgeführt. Als Shell hatte ich die Windows Power Shell verwendet.

Auch hier lief alles ohne Fehlermeldungen durch. Jedoch hatte ich obwohl ich die Spracheinstellungen wie beschrieben gesetzt hatte trotzdem keine Umlaute.

Behoben habe ich dieses Problem indem ich anstatt der Windows Power Shell die alte CMD.exe nutzte und die Sprachinstallation nochmals durchführt.

Im Anschluss daran wurden die Umlaute ordentlich angezeigt.

Montag, 23. November 2009

Howto: Auto Increment mit der Hsqdb Datenbank

Howto: Auto Increment bei der Hsqldb Datenbank

Da ich gerade die Gelegenheit hatte mich, zugegeben schon zu fortgeschrittener Stunde durch die Dokumentation der Hsqldb Datenbank zu kämpfen und mehrere Foren zu durchsuchen, die zwar auf vieles eine Antwort haben, jedoch nie genau auf das was man sucht, schreibe ich hiermit meinen ersten Blog-Eintrag. 

Die Ausgangslage stellt sich wie folgt dar. Genutzt wird eine Java Desktop Application, die diverse Werte in eine Tabelle speichern soll. Genutzt wird als Datenbank eine Hsqldb 1.8.1.1. Mit jedem Insert soll die Id des Datensatzes automatisch erhöht werden, so wie man es z.B. von einer MySQL Datenbank mit ihrem auto_increment Feature kenn.

Nehmen wir uns hier eine fiktive Tabelle, welche einfach aus einer Column für einen Wert besteht und einer Id-Column.

Tabellenname: TBL_BEISPIEL

Columns: BEI_ID, BEI_VALUE // BEI_ID wird als Primärschlüssel definiert

Um diese Tabelle anzulegen würden wir standardmäßig folgendes SQL Statement nutzen:

CREATE TABLE TBL_BEISPIEL (BEI_ID INTEGER NOT NULL PRIMARY KEY, BEI_VALUE INTEGER NOT NULL);

Die Syntax die in diesem Statement noch fehlt ist unsere gewünschte Id-Incrementierung. Laut der Hsqldb-Dokumentation lautet sie wie folgt:

INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH n, [INCREMENT BY m])

In unserem konkreten Beispiel sähe das Statement dann so aus:

CREATE TABLE TBL_BEISPIEL (BEI_ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1, INCREMENT BY 1) NOT NULL PRIMARY KEY, BEI_VALUE INTEGER NOT NULL);

Wichtig ist hierbei bei einem Insert aus der Java Application heraus zu beachten dass dem Insert-Statement die BEI_ID Column mit einem Value von null mitgegeben wird.

z.B. INSERT INTO TBL_BEISPIEL (BEI_ID, BEI_VALUE) VALUES (null, 11111);

Durch den Null-Wert im Increment Statement wird datenbankseitig dann automatisch die Funktion IDENTITY() aufgerufen, welche den letzten Wert der ID ermittelt und erhöht.