Python调用入参为用户自定义类型的Oracle存储过程方法
错误原因
存储过程EMP_NEW_PKG.EMP_INSERT_PROC的入参规则和你传参的形式完全不匹配:
- 该存储过程仅接收1个入参,类型为schema级自定义嵌套表
EMP_TAB(表中元素为EMP_TYP自定义对象,包含EMP_ID、EMP_NAM两个字段) - 你写的调用代码传了2个独立字符串参数,既参数数量不对,参数类型也完全不符合存储过程的定义,因此触发PLS-00306类型/参数数量不匹配错误。
可行解决代码
你需要使用Oracle官方Python驱动(新版python-oracledb或旧版cx_Oracle,二者API兼容),先在Python侧映射数据库的自定义类型,构造符合结构的嵌套表对象后再传参,示例代码如下:
# 若使用旧版cx_Oracle,替换导入语句为 import cx_Oracle as oracledb import oracledb # 替换为你自己的数据库连接信息 conn = oracledb.connect( user="your_db_user", password="your_db_password", dsn="your_db_host:port/your_service_name" ) cursor = conn.cursor() # 获取数据库中自定义类型的引用 emp_obj_type = conn.gettype("EMP_TYP") emp_table_type = conn.gettype("EMP_TAB") # 初始化要传入的嵌套表对象 emp_records = emp_table_type.newobject() # 构造单条员工记录并追加到嵌套表 emp_rajan = emp_obj_type.newobject() emp_rajan.EMP_ID = "12345" emp_rajan.EMP_NAM = "Rajan" emp_records.append(emp_rajan) # 如需批量插入多条记录,重复上述构造对象、append的步骤即可 # emp_zhangsan = emp_obj_type.newobject() # emp_zhangsan.EMP_ID = "12346" # emp_zhangsan.EMP_NAM = "Zhang San" # emp_records.append(emp_zhangsan) # 调用存储过程,仅传入1个构造好的嵌套表参数 cursor.callproc("EMP_NEW_PKG.EMP_INSERT_PROC", [emp_records]) # 建议事务提交放在业务侧控制,不要硬编码在存储过程中 conn.commit() cursor.close() conn.close()
注意事项
- 若你的自定义类型是定义在PL/SQL包内而非schema级别,调用
gettype时需要补充包名前缀,格式为包名.类型名;你当前定义的EMP_TYP、EMP_TAB是schema级类型,直接传类型名即可。- 建议删除存储过程中写死的
COMMIT;语句,事务提交逻辑放在应用层(即Python代码侧)控制,避免事务逻辑和数据操作耦合,更方便异常场景下的事务回滚。
内容的提问来源于stack exchange,提问作者Biswajit Sarkar
相关产品推荐
相关产品推荐

