从Oracle表选择SDO_GEOMETRY插入另一表时遇数据类型错误
解决Oracle SDO_GEOMETRY类型字段跨库插入问题
问题分析
你遇到的核心问题是类型不匹配和函数误用:
- 使用
MDSYS.SDO_UTIL.TO_WKTGEOMETRY()会将SDO_GEOMETRY转为CLOB类型,而目标表字段是SDO_GEOMETRY,直接插入必然触发ORA-00932类型不一致错误。 MDSYS.SDO_UTIL.EXTRACT()用于从复杂几何对象中提取子元素,参数用法错误(第二个参数应为XML路径,如'/*'),且不适合作为跨库插入的转换方式,因此触发内部OCI错误。
解决方案
方案1:直接读取原始SDO_GEOMETRY对象(推荐)
cx_Oracle原生支持SDO_GEOMETRY类型的对象传递,无需额外转换,直接查询原始字段即可完成插入:
import cx_Oracle # 源数据库连接与查询 connection_src = cx_Oracle.connect('source connection string') cursor_src = connection_src.cursor() cursor_src.arraysize = 500 # 直接查询原始几何字段,不做转换 cursor_src.execute("""select ID, Geometry_column from src_schema.src_table""") # 目标数据库连接与批量插入 connection_dst = cx_Oracle.connect('destination connection string') cursor_dst = connection_dst.cursor() # 循环批量处理数据 while True: rows = cursor_src.fetchmany() if not rows: break cursor_dst.executemany( "INSERT INTO dest_schema.dest_table (ID, Geometry_column) VALUES (:1, :2)", rows ) connection_dst.commit() # 每批提交,避免事务过大 # 关闭资源 cursor_src.close() connection_src.close() cursor_dst.close() connection_dst.close()
方案2:WKT中转后转换回SDO_GEOMETRY(特殊场景用)
如果因业务需要必须通过WKT格式中转,插入时需用MDSYS.SDO_GEOMETRY()构造函数将CLOB转回目标类型,注意指定匹配的空间参考ID(SRID):
import cx_Oracle connection_src = cx_Oracle.connect('source connection string') cursor_src = connection_src.cursor() cursor_src.arraysize = 500 # 查询时转为WKT格式(返回CLOB) cursor_src.execute("""select ID, MDSYS.SDO_UTIL.TO_WKTGEOMETRY(Geometry_column) from src_schema.src_table""") connection_dst = cx_Oracle.connect('destination connection string') cursor_dst = connection_dst.cursor() while True: rows = cursor_src.fetchmany() if not rows: break # 插入时将WKT转为SDO_GEOMETRY,替换4326为你的实际SRID cursor_dst.executemany(""" INSERT INTO dest_schema.dest_table (ID, Geometry_column) VALUES (:1, MDSYS.SDO_GEOMETRY(:2, 4326)) """, rows) connection_dst.commit() # 关闭资源 cursor_src.close() connection_src.close() cursor_dst.close() connection_dst.close()
内容的提问来源于stack exchange,提问作者ajd018
相关产品推荐
相关产品推荐

