3

以下を使用して作成されたOracleテーブルがあるとします。

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

Win32拡張機能(win32allパッケージから)のPython ODBCモジュールを使用して、次のことを試しました。

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)では、この問題は発生しません。タイムスタンプを取得する方法はありますか?

4

2 に答える 2

2

これは Oracle ODBC ドライバーのバグだと思います。基本的に、Oracle ODBC ドライバーはデータ型をサポートせずTIMESTAMP WITH (LOCAL) TIME ZONE、データ型のみをサポートしますTIMESTAMP。あなたが発見したように、1つの回避策は実際にTO_CHARメソッドを使用することです.

あなたの例では、実際にはタイムゾーン情報を読んでいません。TIMESTAMPテーブルを制御できる場合は、テーブルをストレートカラムに変換できます。テーブルを制御できない場合、別の解決策として、文字列TIMESTAMP WITH TIME ZONEを介して から に変換するビューを作成することもできます。申し訳ありませんが、 からにTIMESTAMP直接変換する方法があるかどうかはわかりません。TIMESTAMP WITH TIME ZONETIMESTAMP

于 2008-09-02T02:33:57.807 に答える
1

これに対する私の解決策は、改善できることを願っており、Oracleを使用してTIMESTAMPを明示的に文字列に変換することです。

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

これは機能しますが、移植性はありません。SQL Serverデータベースに対して同じPythonスクリプトを使用したいので、Oracle固有のソリューション(TO_CHARなど)は機能しません。

于 2008-09-01T21:14:43.110 に答える