Datumsformat in gespeicherten Views einer Oracle-DB

15/04/2009 - 10:09 von Andreas Preugschat | Report spam
Hallo NG,
ich habe mir ein kleines Excel-Addin gebastelt, mit dem ich kleinere
Ad-hoc-Abfragen über eine Oracle-DB ausführen kann. Die Verbindung stelle ich
mit ADO her unter Verwendung des "OraOLEDB.Oracle"-Treibers.
Meine SQL-Kommandos führe ich nach diesem Muster aus:


With Cmd
.ActiveConnection = OraCnn
.CommandType = adCmdText
.CommandText = "SELECT * FROM TABELLE1"
..

Die Abfragen, die ich ausführe, sind als Textdateien auf dem lokalen Rechner
gespeichert. Hierbei ist mir bereits aufgefallen, dass die Syntax, die im
SQL-Developer einwandfrei funktioniert über ADO Fehlermeldungen verursacht.
Lautet ein Statement z.B. "SELECT * FROM TABLE1 WHERE DATUM='31.12.2008'",
wird die Fehlermeldung "ORA-01847: Tag des Monats muss zwischen 1 und letztem
Tag des Monats liegen" ausgegeben.
Die Lösung des Problems ist folgende Formulierung: "WHERE
DATUM=TO_DATE('2008-12-31')".
Nun wollte ich bereits in der DB vorhandene Views benutzen. Zum Teil
enthalten die Where-Klauseln konstante Datumsliterale, die in der normalen
deutschen Schreibweise gespeichert sind (NLS-Parameter sind entsprechend
eingestellt).

Das Kommando wird dann so eingeleitet:

...
With Cmd
.ActiveConnection = OraCnn
.CommandType = adCmdText
.CommandText = "SELECT * FROM " & Eigentuemer & "." & AbfrageName


Die Variable "Eigentuemer" repràsentiert das DB-Schema und "AbfrageName" die
betroffene Sicht.

Auch hier erhalte ich die Fehlermeldung ORA-01847. Wird in der View das
Datumsliteral wie beschrieben aufbereitet, funktioniert das wieder.

Frage: Hebelt ADO die NLS-Parameter so aus, dass auch gespeicherte Views
entsprechend umformuliert werden müssten?

Mit freundlichen Gruessen aus Berlin
Andreas Preugschat

Windows XP SP2 // Office 2003 SP2
 

Lesen sie die antworten

#1 Ingo Moch
19/04/2009 - 23:51 | Warnen spam
Hallo Andreas,

"Andreas Preugschat" schrieb:

ich habe mir ein kleines Excel-Addin gebastelt, mit dem ich kleinere
Ad-hoc-Abfragen über eine Oracle-DB ausführen kann. Die Verbindung
stelle ich mit ADO her unter Verwendung des "OraOLEDB.Oracle"-
Treibers. [...]

Hierbei ist mir bereits aufgefallen, dass die Syntax, die im SQL-
Developer einwandfrei funktioniert über ADO Fehlermeldungen
verursacht. Lautet ein Statement z.B. "SELECT * FROM TABLE1
WHERE DATUM='31.12.2008'", wird die Fehlermeldung
"ORA-01847: Tag des Monats muss zwischen 1 und letztem
Tag des Monats liegen" ausgegeben.
Die Lösung des Problems ist folgende Formulierung: "WHERE
DATUM=TO_DATE('2008-12-31')".



AFAIR unterstuetzt Oracle nicht per se das ISO-Format. Die IMHO sicherste
und von den NLS-Parametern unabhaengige Variante ist die Angabe des
Formats:

TO_DATE('2008-12-31', 'RRRR-MM-DD')

Nun wollte ich bereits in der DB vorhandene Views benutzen. Zum
Teil enthalten die Where-Klauseln konstante Datumsliterale, die in
der normalen deutschen Schreibweise gespeichert sind (NLS-
Parameter sind entsprechend eingestellt).



Literale? AFAIR sind das Zeichenfolgen, die per implizierter
Typkonvertierung in ein Datum umgewandelt werden.

Das Kommando wird dann so eingeleitet:

...
With Cmd
.ActiveConnection = OraCnn
.CommandType = adCmdText
.CommandText = "SELECT * FROM " & Eigentuemer & "." & AbfrageName


Die Variable "Eigentuemer" repràsentiert das DB-Schema und
"AbfrageName" die betroffene Sicht.

Auch hier erhalte ich die Fehlermeldung ORA-01847. Wird in der View
das Datumsliteral wie beschrieben aufbereitet, funktioniert das wieder.

Frage: Hebelt ADO die NLS-Parameter so aus, dass auch gespeicherte
Views entsprechend umformuliert werden müssten?



ADO mit Sicherheit nicht ... das ist datenbankneutral. Wenn, dann der OLE
DB-
Treiber bzw. die benutzten Komponenten. Das kann ich mir insbesondere bei
Oracle gut vorstellen. Ich wuerde mal die NLS-Parameter der Oracle-Runtime
mit denen des Oracle-Servers abgleichen. Zum OLE DB-Treiber gibt es auch
eine gute Dokumentation. Ueber die Eigenschaften der ADO-Objekte laesst
sich da auch einiges ermitteln und manipulieren.

Allerdings wundert es mich doch sehr, dass das Problem auch bei Views
auftritt. Die werden ja auf dem Server ausgeführt und nur das Ergebnis
zurueckgeliefert.

JM2C
Ingo

Ähnliche fragen