"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

[Oracle] Mysteriöses Problem mit Select aus Tabelle mit Timestamp Feld

Mr. Zet 27.08.2009 - 18:43 3038 8
Posts

Mr. Zet

Super Moderator
resident spacenerd
Avatar
Registered: Oct 2000
Location: Edge of Tomorrow
Posts: 12040
Hallo allerseits.

Oracle treibt mich mal wieder in den Wahnsinn...

Hintergrund: Ich arbeite an einem Projekt, das unter anderem (leider) mit einem Oracle Server arbeiten muss.
Bisher konnte ich den Oracle spezifischen Code lokal nicht testen, weil ich keinen Server zur Verfügung hatte. Da es aber kein Zustand ist, dass ich bei notwendigen Änderungen jedes mal zum Kunden fahre, habe ich jetzt endlich auch einen Oracle Server zur Verfügung gestellt bekommen.

So weit so gut, aber ich habe da jetzt auf "meinem" Server ein Problem, dass beim Kunden nicht auftritt:

Ich kann kein Select absetzen auf eine Tabelle, die ein TIMESTAMP Feld enthält. Dieser Teil des Codes hat sich seit Monaten nicht geändert und funktionierte beim Kunden bisher problemlos im Testbetrieb. Vermutung: es muss irgendwie an den Einstellungen des Servers liegen.

Warum ich vermute, dass es an TIMESTAMP und an den Settings liegt?
Alles andere geht: Drop Table, Create Table, Select/Insert/Delete auf Tabellen ohne TIMESTAMP und sogar Insert/Delete auf Tabellen MIT TIMESTAMP!

(Projekt wird entwickelt mit VB.net (Framework 2.0) in Visual Studio 2005)

Konkreter Fall:

Tabelle:
Code:
CREATE TABLE "MYSCHEMA"."ALARME" (
"GERAETE_NR" NUMBER(10) NOT NULL, 
"GERAETETYPE" VARCHAR2(100) NOT NULL, 
"FEHLERCODE" NUMBER(4) NOT NULL, 
"REASON" VARCHAR(512) NOT NULL, 
"ZEITPUNKT" TIMESTAMP NOT NULL
);
Abfrage:
Code:
SELECT *
FROM {schema}.alarme
WHERE GERAETE_NR = {1} AND GERAETETYPE = '{2}'
ORDER BY ZEITPUNKT DESC;
Wobei alles was in geschwungenen Klammern steht vor dem Absetzen des Statements durch die tatsächlich gewünschten Daten ersetzt wird. (Was auch überall einwandfrei funktioniert)

Bekomme ich zurück:
"ORA-00932: nicht übereinstimmende Datentypen
" (Der Linebreak ist hier wirklich drinnen...)

ABER:
Das passiert auch, wenn die die Abfrage auf
Code:
SELECT * FROM {schema}.alarme
reduziere!

UND:
Es passiert auch, wenn ich die Datenbank im Visual Studio im Server Explorer verbinde und mir dort die Tabelle ansehen will!

ABER:
Wenn ich das Statement (egal in welcher Form) direkt in SQL Plus absetze, dann bekomm ich wie gewünscht den Inhalt der Tabelle!

-> Verwirrung perfekt... :confused:


Google spuckt dazu leider nichts brauchbares aus. Ansich ist der Fehler ja eher für nicht durchgeführte Typkonvertierungen da. Auf Englisch heißt er ja auch
"ORA-00932: inconsistent datatypes: expected <X> got <Y>"
aber scheinbar wurde dem Übersetzer zu wenig bezahlt, denn auf Deutsch werden die Typen nicht angegeben :o


Hat irgendjemand eine Idee, woran es hier scheitert?

Nico

former person of interest
Registered: Sep 2006
Location: -
Posts: 4082
liegt eventuell am angegebenen objektnamen? jedes schema gehört ja jemandem? schau auf deine leserechte und dass nur ein objekt mit dem namen schema.alarme gemeint sein kann.

strumma

Little Overclocker
Avatar
Registered: Nov 2006
Location: LL/KR
Posts: 129
welche DB-Version ist im Einsatz? Selektier mal nur die Geräte-Nr aus VB heraus...

Mr. Zet

Super Moderator
resident spacenerd
Avatar
Registered: Oct 2000
Location: Edge of Tomorrow
Posts: 12040
Am Schemaname und an den Leserechten liegt es nicht. Das wäre ja zu einfach gewesen ;)

Alle Tabellen der Anwendung gehören zum gleichen Schema, das wird also immer mit dem gleichen Wert ersetzt.

edit:
@ strumma:
OracleConn.ServerVersion = "9.2.0.1.0 Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production"

edit2:
Wenn ich alles selektiere BIS auf das timestamp-Feld, dann geht es!
Bearbeitet von Mr. Zet am 27.08.2009, 19:34

Nico

former person of interest
Registered: Sep 2006
Location: -
Posts: 4082
dann verträgt er wohl den zeichensatz nicht den du bei der DB-erstellung gewählt hast?

strumma

Little Overclocker
Avatar
Registered: Nov 2006
Location: LL/KR
Posts: 129
Hat dein Kunde eine neuere ODBC-Version? Hab im Metalink folgendes gefunden:

"Doc ID: 370861.1
Applies to:
Oracle ODBC Driver - Version: 9.2.0.4
Bug 3641038 TIMESTAMP WITH LOCAL TIME ZONE COLUMN CAUSES ORA-00932

There is curerntly no support for TIMESTAMP with LOCAL TIME ZONE in ODBC.
Only the basic TIMESTAMP is supported.

WORKAROUND:

Wrap the Timezone in TO_CHAR. "

Sprich, wenn du folgendes ausführst:

select data_type
from user_tab_cols
where column_name='SPALTE'
and table_name='TABELLE'

... und das Ergebnis etwas mit 'TIMEZONE' zu Tage bringt, kann dein ODBC-Driver einfach nicht damit umgehen.

Mr. Zet

Super Moderator
resident spacenerd
Avatar
Registered: Oct 2000
Location: Edge of Tomorrow
Posts: 12040
Das mit der ODBC Version könnte ich mir gut vorstellen, dem werde ich auf den Grund gehen müssen.

Was mich allerdings verwirrt: Ich verwende ja den "basic" TIMESTAMP.
"TIMESTAMP WITH LOCAL TIME ZONE" ist ja ein eigener Datentyp.

@ Nico:
Wie soll das zusammen hängen? Wenn was mitm Charset nicht stimmt, wieso funktionieren dann Insert statements?

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
ein standard timestamp (iso xxxx) hat ja so eine form wie dd/mm/yy hh:mm UTC+x egal ob du jetzt timezone angaben dazugibst oder nicht, wenn du das nicht machst nimmt der server entweder die System-Zone, irgendwas eingestelltes? oder 0 als "default" an.

Kennst du eigentlich die Version vom Kunden? Wenn du dort nicht die gleiche Version hast brauchst auch nicht weiter suchen, sondern solltest eher mal die Versionen angleichen und dann nochmal probieren.

strumma

Little Overclocker
Avatar
Registered: Nov 2006
Location: LL/KR
Posts: 129
Der systimestamp hat standardmäßig eine Angabe der Zeitzone dabei (http://download-west.oracle.com/doc...unctions173.htm), aber es gibt Timestamps auch ohne Timezone: http://download-west.oracle.com/doc...ch4datetime.htm

Jedenfalls schließe ich mich watchout an - wenn du nicht mit der gleichen Version wie dein Kunde arbeitest kannst du dann eventuell auch beim Einspielen deiner Software die eine oder andere Überraschung erleben.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz