2016-10-18 5 views
0

오라클 클라이언트 라이브러리 11.2와 Oracle 서버 11.2에서 cx_Oracle 5.2.1을 사용하여 ORDSYS.ORDIMAGE 필드의 내용을 검색 할 수 없습니다. 다음 코드는 attribute read not found exception 제기 제기Python에서 ORDSYS.ORDIMAGE 필드 값을 얻는 방법

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 읽기() 메소드가없는 것입니다. 대신, 다른 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 * 플러스의 유형을 설명 할 수

당신은 파이썬 코드에서 다음을 수행 할 수 있도록해야
desc ordsys.ordimage 

:

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

을 SOURCE 속성은 또 다른 객체이므로 같은 방식으로 속성에 액세스 할 수 있습니다.

등의 속성에 유의하십시오.

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