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

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()
注意事项
  1. 若你的自定义类型是定义在PL/SQL包内而非schema级别,调用gettype时需要补充包名前缀,格式为包名.类型名;你当前定义的EMP_TYP、EMP_TAB是schema级类型,直接传类型名即可。
  2. 建议删除存储过程中写死的COMMIT;语句,事务提交逻辑放在应用层(即Python代码侧)控制,避免事务逻辑和数据操作耦合,更方便异常场景下的事务回滚。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 03:06:38