的问题是,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