cx_Oracle - Oracle 类型 2010 和本机类型 3000 之间的转换未实现
cx_Oracle - conversion between Oracle type 2010 and native type 3000 is not implemented
我正在尝试使用 cx_Oracle 从用户定义类型 (UDT) 中提取数据。我能够毫无问题地提取某些 UDT 的数据,但对于一个特定的 UDT,我无法提取数据。
Oracle 中的类型结构:
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 中使用此代码提取 UDT ():
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
然后,如果我尝试从 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
看起来 Oracle odpi 数据类型转换有问题。在此特定示例中,数据看起来像这样(来自 SQL 开发人员):
GRAPHIC_COMPONENT(1007,17,'gtda_5012101_1',NULL,NULL,NULL,NULL)
检查您的 cx_Oracle 版本。
It looks like 2017 年 9 月添加了从 DPI_ORACLE_TYPE_NUMBER(2010)
到 DPI_NATIVE_TYPE_INT64(3000)
的转换支持。
我正在尝试使用 cx_Oracle 从用户定义类型 (UDT) 中提取数据。我能够毫无问题地提取某些 UDT 的数据,但对于一个特定的 UDT,我无法提取数据。 Oracle 中的类型结构:
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 中使用此代码提取 UDT (
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
然后,如果我尝试从 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
看起来 Oracle odpi 数据类型转换有问题。在此特定示例中,数据看起来像这样(来自 SQL 开发人员):
GRAPHIC_COMPONENT(1007,17,'gtda_5012101_1',NULL,NULL,NULL,NULL)
检查您的 cx_Oracle 版本。
It looks like 2017 年 9 月添加了从 DPI_ORACLE_TYPE_NUMBER(2010)
到 DPI_NATIVE_TYPE_INT64(3000)
的转换支持。