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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:24:52