2016-10-18 61 views
0

得到ORDSYS.ORDIMAGE字段值使用cx_Oracle 5.2.1 Oracle客戶端庫11.2和Oracle服務器11.2,我無法檢索ORDSYS.ORDIMAGE字段的內容。 下面的代碼引發attribute read not found exception豪在Python

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,它會顯示你在其輸出端的開始的屬性列表類型

desc ordsys.ordimage 

這應該讓你做你的Python代碼如下:

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

請注意,屬性源是另一個對象,這樣就可以用同樣的方式訪問它的屬性:

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

等等。

屬性bf.SOURCE.LOCALDATA是類型BLOB這是目前不支持的。你可以使用匿名的PL/SQL塊來訪問它的值:

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

相關問題