Ανάκτηση μια χρονική σήμανση της Oracle με τη χρήση της μονάδας Win32 ODBC της Python

ψήφοι
2

Λαμβάνοντας υπόψη ένα πίνακα της Oracle που δημιουργήθηκε χρησιμοποιώντας την ακόλουθη:

CREATE TABLE Log(WhenAdded TIMESTAMP(6) WITH TIME ZONE);

Χρησιμοποιώντας τη μονάδα Python ODBC από της επεκτάσεις Win32 (από το πακέτο win32all), δοκίμασα τα εξής:

import dbi, odbc

connection = odbc.odbc(Driver=Oracle in OraHome92;Dbq=SERVER;Uid=USER;Pwd=PASSWD)

cursor = connection.cursor()
cursor.execute(SELECT WhenAdded FROM Log)

results = cursor.fetchall()

Όταν τρέχω αυτό, παίρνω το εξής:

Traceback (most recent call last):
...
    results = cursor.fetchall()
dbi.operation-error: [Oracle][ODBC][Ora]ORA-00932: inconsistent datatypes: expected %s got %s 
in FETCH

Οι άλλοι τύποι δεδομένων που έχω δοκιμάσει (VARCHAR2, BLOB) δεν προκαλούν αυτό το πρόβλημα. Είναι ένας τρόπος ανάκτησης χρονικές σφραγίδες εκεί;

Δημοσιεύθηκε 01/09/2008 στις 20:06
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
1

Η λύση μου σε αυτό, ότι ελπίζω να βελτιώσαμε, είναι η χρήση της Oracle για να μετατρέψετε ρητά τη χρονική σήμανση σε μια σειρά:

cursor.execute("SELECT TO_CHAR(WhenAdded, 'YYYY-MM-DD HH:MI:SSAM') FROM Log")

Αυτό λειτουργεί, αλλά δεν είναι φορητό. Θα ήθελα να χρησιμοποιήσω την ίδια Python script σε μια βάση δεδομένων του SQL Server, οπότε η Oracle ειδική λύση (όπως TO_CHAR) δεν θα λειτουργήσει.

Απαντήθηκε 01/09/2008 στις 20:14
πηγή χρήστη

ψήφοι
2

Πιστεύω ότι πρόκειται για ένα σφάλμα στο πρόγραμμα οδήγησης Oracle ODBC. Βασικά, ο οδηγός Oracle ODBC δεν υποστηρίζει τους TIMESTAMP WITH (LOCAL) TIME ZONEτύπους δεδομένων, μόνο τον TIMESTAMPτύπο δεδομένων. Όπως έχετε ανακαλύψει, μία λύση είναι στην πραγματικότητα να χρησιμοποιήσει τη TO_CHARμέθοδο.

Στο παράδειγμά σας, δεν είναι στην πραγματικότητα διαβάζουν τις πληροφορίες ζώνης ώρας. Αν έχετε τον έλεγχο του πίνακα μπορείτε να το μετατρέψετε σε μια ευθεία TIMESTAMPστήλη. Αν δεν έχετε τον έλεγχο πάνω στο τραπέζι, μια άλλη λύση μπορεί να είναι να δημιουργήσετε μια προβολή που μετατρέπει από TIMESTAMP WITH TIME ZONEσε TIMESTAMPμε μια σειρά - συγγνώμη, δεν ξέρω αν υπάρχει ένας τρόπος για να μετατρέψει άμεσα από TIMESTAMP WITH TIME ZONEέως TIMESTAMP.

Απαντήθηκε 02/09/2008 στις 01:33
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more