如何通过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构造对应类型的实例
正确的实现步骤如下:
- 获取Oracle自定义对象类型的元数据
- 构造该类型的实例并设置对应属性值
- 传入正确数量的参数调用存储过程
完整代码示例:
# 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
相关产品推荐
相关产品推荐

