2016-10-18 24 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

相关问题