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
相关产品推荐
相关产品推荐

