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

Python使用cx_Oracle调用Oracle存储函数遇ORA-04043错误问询

错误原因

ORA-04043: object MY_PKG_1.MY_DATA_TYPE does not exist报错的核心是:MY_PKG_1.MY_DATA_TYPE是定义在包内部的PL/SQL类型,不属于Oracle全局Schema级别的自定义类型,Python Oracle驱动(cx_Oracle/oracledb)的gettype()方法只能识别通过CREATE TYPE语句创建的全局类型,无法直接读取包内定义的类型,因此抛出找不到对象的错误。

最优解决方案

不需要使用callfunc调用函数,直接执行查询语句读取函数返回的集合结果即可,完全兼容你原来可正常运行的原生逻辑,示例代码如下:

cursor = connection.cursor()
# 直接执行查询,绑定入参,无需包裹在匿名PL/SQL块中
cursor.execute("""
SELECT * FROM TABLE(MY_PKG_2.MY_FUNC(
    param_1 => :p1,
    param_2 => :p2
))
""", p1="some data", p2="some more data")

# 直接获取所有结果
results = cursor.fetchall()

# 也可以逐行迭代处理
# for row in cursor:
#     print(row)

如果执行时报权限错误,可补全两个包所属的Schema名称,例如:SELECT * FROM TABLE(你的Schema名.MY_PKG_2.MY_FUNC(...))。

备选方案(需修改数据库配置)

如果你坚持要使用callfunc调用函数,需要先在数据库侧执行CREATE TYPE语句,将MY_PKG_1.MY_DATA_TYPE改为全局Schema级别的类型,之后就可以通过connection.gettype()正常读取到该类型。


内容的提问来源于stack exchange,提问作者ZDV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:54:08