2016-10-18 3 views
0

Oracleクライアントライブラリ11.2とOracleサーバー11.2でcx_Oracle 5.2.1を使用すると、ORDSYS.ORDIMAGEフィールドの内容を取得できません。 次のコードは、attribute read not found exceptionを提起:PythonのORDSYS.ORDIMAGEフィールド値を取得する方法

import cx_Oracle 
db = cx_Oracle.Connection('user/[email protected]/t') 
cursor = db.cursor() 
cursor.execute("select IMAGE from T where ROWID in ('AAAAAAAAAA')") 
bf, = cursor.fetchone() 
bfile_data = bf.read() 

発生する例外である:AttributeError: 'cx_Oracle.OBJECT' object has no attribute 'read'

答えて

1

問題はcx_Oracle.OBJECTは、read()メソッドを持たないことです。代わりに、他のPythonオブジェクトと同様に読み書きできる属性を持っています。

次の一般的なコードは動作しますcx_Oracleの未発表バージョンを使用して:

def ObjectRepr(obj): 
    if obj.type.iscollection: 
     returnValue = [] 
     for value in obj.aslist(): 
      if isinstance(value, cx_Oracle.Object): 
       value = ObjectRepr(value) 
      returnValue.append(value) 
    else: 
     returnValue = {} 
     for attr in obj.type.attributes: 
      value = getattr(obj, attr.name) 
      if value is None: 
       continue 
      elif isinstance(value, cx_Oracle.Object): 
       value = ObjectRepr(value) 
      returnValue[attr.name] = value 
    return returnValue 

print(ObjectRepr(bf)) 

あなたは5.2.1を使用している場合は、しかし、内省的なコードの一部が利用できません。幸いにも、あなたはそれを必要としません。あなたは、その出力の初めにあなたの属性の一覧が表示されますSQL * Plusで型を記述することができます

、あなたのPythonコードに次の操作を行うできるようにする必要があり
desc ordsys.ordimage 

print(bf.HEIGHT) 
print(bf.WIDTH) 
print(bf.CONTENTLENGTH) 
print(bf.FILEFORMAT) 

print(bf.SOURCE.SRCNAME) 
print(bf.SOURCE.UPDATETIME) 

など:あなたは同じようにその属性にアクセスできるように属性SOURCEは、さらにもう1つの目的であることに注意してください。

bf.SOURCE.LOCALDATA属性は、現在サポートされていないBLOB型です。

var = cursor.var(cx_Oracle.BLOB) 
cursor.execute(""" 
     declare 
      t_Image ordsys.ordimage; 
     begin 
      select Image 
      into t_Image 
      from T 
      where rownum <= 1; 

      :1 := t_Image.source.localdata; 

     end;""", (var,)) 
blob = var.getvalue() 
print("Image data is:", blob.read()) 
+0

属性の値ではなく、イメージの内容を取得する方法を教えてください。 – mtoloo

+0

私はORDSYS.ORDIMAGEを使用していませんが、bf.SOURCE.LOCALDATAにアクセスする必要があると思います。 PL/SQLコードを使用して最初にアクセスすることで確認できます。 –

+0

最初にPL/SQLで確認する方法はわかりませんが、bf.SOURCE.LOCALDATAを使用すると、 'NotSupportedError:ExternalObjectVar_GetAttributeValue():未処理のデータ型113 '例外が発生します。 – mtoloo

関連する問題