استرداد الطابع الزمني لـ Oracle باستخدام وحدة Python Win32 ODBC
سؤال
بالنظر إلى جدول 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) لا تسبب هذه المشكلة.هل هناك طريقة لاسترجاع الطوابع الزمنية؟
المحلول
أعتقد أن هذا خطأ في برنامج تشغيل Oracle ODBC.بشكل أساسي، لا يدعم برنامج تشغيل Oracle ODBC TIMESTAMP WITH (LOCAL) TIME ZONE
أنواع البيانات، فقط TIMESTAMP
نوع البيانات.كما اكتشفت، أحد الحلول هو في الواقع استخدام TO_CHAR
طريقة.
في المثال الخاص بك، أنت لا تقرأ فعليًا معلومات المنطقة الزمنية.إذا كان لديك السيطرة على الجدول يمكنك تحويله إلى مستقيم TIMESTAMP
عمود.إذا لم يكن لديك القدرة على التحكم في الجدول، فقد يكون الحل الآخر هو إنشاء طريقة عرض يتم التحويل منها TIMESTAMP WITH TIME ZONE
ل TIMESTAMP
عبر سلسلة - آسف، لا أعرف إذا كانت هناك طريقة للتحويل مباشرة من TIMESTAMP WITH TIME ZONE
ل TIMESTAMP
.
نصائح أخرى
الحل الذي أرجو أن يكون أفضل، هو استخدام Oracle لتحويل الطابع الزمني بشكل صريح إلى سلسلة:
cursor.execute("SELECT TO_CHAR(WhenAdded, 'YYYY-MM-DD HH:MI:SSAM') FROM Log")
هذا يعمل، لكنه ليس محمولاً.أرغب في استخدام نفس البرنامج النصي Python مقابل قاعدة بيانات SQL Server، لذلك لن يعمل الحل الخاص بـ Oracle (مثل TO_CHAR).