豪在Python
问题描述:
得到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'
答
的问题是,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