問題は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で型を記述することができます
、あなたのPythonコードに次の操作を行うできるようにする必要があり
desc ordsys.ordimage
:
print(bf.HEIGHT)
print(bf.WIDTH)
print(bf.CONTENTLENGTH)
print(bf.FILEFORMAT)
を
print(bf.SOURCE.SRCNAME)
print(bf.SOURCE.UPDATETIME)
など:あなたは同じようにその属性にアクセスできるように属性SOURCEは、さらにもう1つの目的であることに注意してください。
bf.SOURCE.LOCALDATA属性は、現在サポートされていないBLOB型です。
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