Python调用Oracle PL/SQL块获取BLOB返回值时遇DPY-3002错误
解决DPY-3002: Python tuple类型不支持的绑定错误
错误根源
报错DPY-3002: Python value of type "tuple" is not supported表明你传给cursor.execute()的参数里存在tuple类型值,oracledb无法将其转换为Oracle兼容的数据类型。常见原因是workspace_id被误定义为tuple(比如写成workspace_id = (123,)而非workspace_id = 123),或者绑定变量的传递格式不符合要求。
修复步骤
1. 校验并修正workspace_id类型
先检查workspace_id的实际类型,确保它是整数(工作区ID)或字符串(工作区名称):
print(type(workspace_id)) # 预期输出:<class 'int'> 或 <class 'str'>
如果输出是<class 'tuple'>,取出单个元素修正:
# 假设workspace_id为类似(123,)的tuple workspace_id = workspace_id[0]
2. 调整绑定变量传递逻辑
oracledb处理输入/输出混合绑定变量时,推荐使用命名绑定避免顺序错误,同时显式指定输出变量的方向:
# 定义输出BLOB变量,明确方向为输出 zip_var = cursor.var(oracledb.DB_TYPE_BLOB, direction=oracledb.BIND_OUT) # 调整PL/SQL使用命名绑定变量 plsql = """ DECLARE l_zip BLOB; BEGIN l_zip := apex_export.zip( p_source_files => apex_export.get_workspace(:workspace_id), p_extra_files => apex_t_export_files( apex_t_export_file( name => 'README.md', contents => 'Merch Read Write Workspace Contents.'), apex_t_export_file( name => 'LICENSE.txt', contents => 'The Universal Permissive License (UPL), Version 1.0') ) ); :output_zip := l_zip; END; """ # 用字典传递参数,区分输入和输出变量 cursor.execute(plsql, {"workspace_id": workspace_id, "output_zip": zip_var}) # 获取输出的BLOB数据并写入文件 zip_data = zip_var.getvalue() with open("workspace_export.zip", "wb") as f: f.write(zip_data)
3. 修正未定义变量问题
原代码中zip_data未定义,必须通过zip_var.getvalue()从输出绑定变量中提取BLOB数据,否则无法正确写入文件。
额外检查项
- 确认
workspace_id对应的值是APEX中存在的有效工作区ID或名称 - 确保当前数据库用户拥有
APEX_EXPORT包的执行权限
内容的提问来源于stack exchange,提问作者Sourabh
相关产品推荐
相关产品推荐

