的問題是,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())
請你讓我知道如何獲取圖像自我的內容,而不是屬性? – mtoloo
我沒有使用ORDSYS.ORDIMAGE,但我猜你需要訪問bf.SOURCE.LOCALDATA。您可以首先使用PL/SQL代碼來確認以訪問它。 –
我不知道如何使用PL/SQL首先檢查,但使用bf.SOURCE.LOCALDATA提出了'NotSupportedError:ExternalObjectVar_GetAttributeValue():未處理的數據類型113'例外。 – mtoloo