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

如何通过Python Oracledb向Oracle存储过程传递自定义对象参数

问题

已通过Python的Oracledb库连接Oracle数据库,相关代码如下:

DB连接

connection = oracledb.connect(user="hr", password=userpwd, dsn="dbhost.example.com/orclpdb") 

游标对象

cursor = connection.cursor()

声明输出变量

out_values = cursor.var(int)

需调用的Oracle存储过程schema.pkg.get_prc定义如下:

CREATE OR REPLACE TYPE schema.tb_enrol_matching
IS OBJECT(
  Email  VARCHAR2(4000),
  Forename  VARCHAR2(4000),
  Lastname VARCHAR2(4000)
);

PROCEDURE schema.pkg.get_prc(
  pt_enrol_data IN  tb_enrol_matching,
  p_enrol_log_id IN  NUMBER,
  p_columns IN  VARCHAR2,
  p_dynamic_columns IN  VARCHAR2
);

尝试传递数组array_values = ['u','U','G']调用存储过程:

cursor.callproc('schema.pkg.get_prc',[array_values ,9713979, '2', '2', 'N'])

但报错:ORA-06550: 第1行: 调用'get_prc'时参数数目或类型错误,请问如何正确传递自定义对象参数?

解答

报错有两个核心原因:

  • 参数数量不匹配:存储过程仅定义了4个输入参数,但你传入了5个(最后多传了一个'N')
  • 自定义对象类型不兼容:不能直接用Python列表传递Oracle自定义对象类型,需要通过Oracledb构造对应类型的实例

正确的实现步骤如下:

  1. 获取Oracle自定义对象类型的元数据
  2. 构造该类型的实例并设置对应属性值
  3. 传入正确数量的参数调用存储过程

完整代码示例:

# 1. 获取自定义对象类型(注意类型名需全大写,与Oracle端定义一致)
enrol_type = connection.gettype("SCHEMA.TB_ENROL_MATCHING")

# 2. 构造对象实例,按类型属性顺序赋值(Email, Forename, Lastname)
enrol_obj = enrol_type.newobject()
enrol_obj.Email = 'u'
enrol_obj.Forename = 'U'
enrol_obj.Lastname = 'G'

# 3. 调用存储过程,参数数量与定义严格匹配
cursor.callproc('schema.pkg.get_prc', [enrol_obj, 9713979, '2', '2'])

如果需要批量传递多个自定义对象(比如对象数组),可先定义对应的Oracle数组类型,再按以下方式构造:

# 假设已定义SCHEMA.TB_ENROL_MATCHING_ARRAY为tb_enrol_matching的数组类型
enrol_array_type = connection.gettype("SCHEMA.TB_ENROL_MATCHING_ARRAY")
enrol_array = enrol_array_type.newobject()
# 向数组中添加对象实例
enrol_array.append(enrol_obj)
# 调用接收数组参数的存储过程
# cursor.callproc('schema.pkg.get_prc_batch', [enrol_array, ...])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 23:15:10