You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中调用Oracle存储函数并传入SDO_GEOMETRY类型参数?

如何在Python中调用Oracle存储函数并传入SDO_GEOMETRY类型参数?

我之前也踩过这个坑!你直接传字符串形式的SDO_GEOMETRY定义是行不通的,Oracle没办法把普通字符串解析成真正的空间类型对象,得用cx_Oracle提供的专用类型来构造这个几何参数才行。

下面是修正后的完整代码示例,一步步给你说明:

步骤1:导入cx_Oracle的空间类型

首先要从cx_Oracle里导入对应的空间类型类:

import cx_Oracle
from cx_Oracle import SDO_GEOMETRY, SDO_POINT_TYPE

步骤2:正确构造SDO_GEOMETRY对象

不要用字符串拼接,直接实例化SDO_GEOMETRY和SDO_POINT_TYPE对象:

# 建立连接(这里替换成你的数据库连接信息)
connection = cx_Oracle.connect("用户名/密码@主机:端口/服务名")
cursor = connection.cursor()

# 构造点对象
point = SDO_POINT_TYPE(40000, 500000, None)
# 构造SDO_GEOMETRY对象,参数依次是:类型(2001代表点)、SRID(坐标系27700)、点对象、后续两个参数对应元素信息和拓扑信息,这里设为None
geom = SDO_GEOMETRY(2001, 27700, point, None, None)

步骤3:调用存储函数并传入几何对象

现在直接把构造好的geom对象作为参数传入callfunc就行:

# 注意第二个参数是函数返回值的类型,这里你原来用的str,要确保和函数实际返回类型匹配
noderef = cursor.callfunc('function123', str, [geom])

额外注意事项

  • 如果你要构造其他类型的几何对象(比如线、多边形),可以用SDO_ELEM_INFO_ARRAY和SDO_ORDINATE_ARRAY来配合构造,比如线的话:
    from cx_Oracle import SDO_ELEM_INFO_ARRAY, SDO_ORDINATE_ARRAY
    line_geom = SDO_GEOMETRY(
        2002, 27700, None,
        SDO_ELEM_INFO_ARRAY(1, 2, 1),
        SDO_ORDINATE_ARRAY(40000, 500000, 41000, 501000)
    )
    
  • 确保你的数据库用户有访问空间类型的权限,比如授予SELECT ON MDSYS.SDO_GEOMETRY之类的权限(如果之前没给的话)。
  • 检查存储函数function123的参数确实是SDO_GEOMETRY类型,避免参数定义和传入类型不匹配。

这样应该就能解决你遇到的“参数数量或类型错误”的问题了,赶紧试试吧!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 07:24:52