通过 cx_Oracle 从用户定义的类型中提取数据
Extract data from User defined type via cx_Oracle
我正在尝试通过 cx_Oracle 从用户定义类型 (UDT) 中提取数据。这是 UDT 结构:
CREATE OR REPLACE TYPE graphic_component AS OBJECT (
type NUMBER(6),
source_type NUMBER(4),
meta_type_id VARCHAR2(50 CHAR),
name VARCHAR2(100 CHAR),
extension_info VARCHAR2(500 CHAR),
symbology_tokens VARCHAR2(2000 CHAR)
);
CREATE OR REPLACE TYPE graphic_component_array AS
VARRAY (10000) OF graphic_component;
这是一个使用 Python 的例子:
>>>insert = cursor.execute("SELECT COMPLEX FROM GRAPHIC WHERE ID=48662511087446403855368")
>>>complex = insert.fetchall()
[(<cx_Oracle.Object SCHEMA.GRAPHIC_COMPONENT_ARRAY at 0x33d71d0>,)]
>>>dir(complex)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'aslist', 'copy', 'delete', 'exists', 'extend', 'first', 'getelement', 'last', 'next', 'prev', 'setelement', 'size', 'trim', 'type']
>>>complex.first()
0
您可以看到有一个很好的用户定义类型,但我无法从这个或任何其他 UDT 中提取数据。我试图检查该对象的所有属性,并找到了方法 first()、getelement() 和 last()。但是这些函数returns只有0.
有没有什么方法可以通过 cx_Oracle 从 UDT 中提取数据,或者有没有其他方法可以获取数据。
更新
<cx_Oracle.Object GRAPHIC_COMPONENT_ARRAY at 0x26c9f10>
Traceback (most recent call last):
File "C:/Users/petr.silhak/PycharmProjects/migration-to-postgresql/test_parsing.py", line 34, in <module>
print(ObjectRepr(complex[0][0]))
File "C:/Users/petr.silhak/PycharmProjects/migration-to-postgresql/test_parsing.py", line 9, in ObjectRepr
value = ObjectRepr(value)
File "C:/Users/petr.silhak/PycharmProjects/migration-to-postgresql/test_parsing.py", line 14, in ObjectRepr
value = getattr(obj, attr.name)
cx_Oracle.DatabaseError: DPI-1014: conversion between Oracle type 2010 and native type 3000 is not implemented
Here是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
你用得像ObjectRepr(complex[0][0])
,如果len(complex)>0
,当然
我正在尝试通过 cx_Oracle 从用户定义类型 (UDT) 中提取数据。这是 UDT 结构:
CREATE OR REPLACE TYPE graphic_component AS OBJECT (
type NUMBER(6),
source_type NUMBER(4),
meta_type_id VARCHAR2(50 CHAR),
name VARCHAR2(100 CHAR),
extension_info VARCHAR2(500 CHAR),
symbology_tokens VARCHAR2(2000 CHAR)
);
CREATE OR REPLACE TYPE graphic_component_array AS
VARRAY (10000) OF graphic_component;
这是一个使用 Python 的例子:
>>>insert = cursor.execute("SELECT COMPLEX FROM GRAPHIC WHERE ID=48662511087446403855368")
>>>complex = insert.fetchall()
[(<cx_Oracle.Object SCHEMA.GRAPHIC_COMPONENT_ARRAY at 0x33d71d0>,)]
>>>dir(complex)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'aslist', 'copy', 'delete', 'exists', 'extend', 'first', 'getelement', 'last', 'next', 'prev', 'setelement', 'size', 'trim', 'type']
>>>complex.first()
0
您可以看到有一个很好的用户定义类型,但我无法从这个或任何其他 UDT 中提取数据。我试图检查该对象的所有属性,并找到了方法 first()、getelement() 和 last()。但是这些函数returns只有0.
有没有什么方法可以通过 cx_Oracle 从 UDT 中提取数据,或者有没有其他方法可以获取数据。
更新
<cx_Oracle.Object GRAPHIC_COMPONENT_ARRAY at 0x26c9f10>
Traceback (most recent call last):
File "C:/Users/petr.silhak/PycharmProjects/migration-to-postgresql/test_parsing.py", line 34, in <module>
print(ObjectRepr(complex[0][0]))
File "C:/Users/petr.silhak/PycharmProjects/migration-to-postgresql/test_parsing.py", line 9, in ObjectRepr
value = ObjectRepr(value)
File "C:/Users/petr.silhak/PycharmProjects/migration-to-postgresql/test_parsing.py", line 14, in ObjectRepr
value = getattr(obj, attr.name)
cx_Oracle.DatabaseError: DPI-1014: conversion between Oracle type 2010 and native type 3000 is not implemented
Here是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
你用得像ObjectRepr(complex[0][0])
,如果len(complex)>0
,当然