URL: https://www.overclockers.at/coding-stuff/oracle_mysterioeses_problem_mit_select_aus_tabelle_209889/page_1 - zur Vollversion wechseln!
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:
Abfrage: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 );
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)Code:SELECT * FROM {schema}.alarme WHERE GERAETE_NR = {1} AND GERAETETYPE = '{2}' ORDER BY ZEITPUNKT DESC;
reduziere!Code:SELECT * FROM {schema}.alarme
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.
welche DB-Version ist im Einsatz? Selektier mal nur die Geräte-Nr aus VB heraus...
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!
dann verträgt er wohl den zeichensatz nicht den du bei der DB-erstellung gewählt hast?
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.
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?
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.
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.
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025