如何从Python向PL/SQL匿名块传递字典?含报错处理需求
Python向PL/SQL匿名块传递字典的正确实现方法
错误原因
你碰到的DPY-3002错误,根源是直接传递了d_data.items()返回的dict_items类型——oracledb驱动不支持这种类型作为绑定变量。
正确实现思路
要实现Python字典传递、PL/SQL遍历键并返回结果,需把字典拆成驱动支持的列表类型传递,再在PL/SQL中处理关联数组,最后通过输出参数返回结果。
完整代码示例
import oracledb # 假设已完成数据库连接初始化(connection变量已就绪) with connection.cursor() as cur: # 示例业务字典 d_data = {'111': 'YES', '222': 'NO', '333': 'YES'} # 将字典拆分为键、值两个列表,作为绑定变量传递 keys_list = list(d_data.keys()) values_list = list(d_data.values()) # 定义输出参数:键列表(字符串数组)、计数器(整数) output_keys = cur.var(oracledb.DB_TYPE_VARCHAR, arraysize=len(keys_list)) output_count = cur.var(oracledb.DB_TYPE_NUMBER) cur.execute("""\ DECLARE -- 定义PL/SQL关联数组类型,匹配字典的键值类型 TYPE d_icusnums_type IS TABLE OF VARCHAR2(100) INDEX BY VARCHAR2(100); d_icusnums d_icusnums_type; -- 定义接收Python列表的PL/SQL表类型 v_keys DBMS_SQL.VARCHAR2_TABLE; v_values DBMS_SQL.VARCHAR2_TABLE; v_count NUMBER := 0; BEGIN -- 接收Python传递的键、值列表 v_keys := :keys; v_values := :values; -- 遍历列表,填充关联数组并计数 FOR i IN 1..v_keys.COUNT LOOP d_icusnums(v_keys(i)) := v_values(i); v_count := v_count + 1; END LOOP; -- 将键列表和计数器赋值给输出参数 output_keys := v_keys; output_count := v_count; END; """, keys=keys_list, values=values_list, output_keys=output_keys, output_count=output_count) # 打印返回结果 print("返回的键列表:", output_keys.getvalue()) print("遍历计数器:", output_count.getvalue())
关键说明
- 变量类型适配:必须将Python字典转换为oracledb支持的列表类型,不能直接传递
dict_items或原始字典(除非配置复杂的类型映射) - PL/SQL遍历逻辑:通过
FOR i IN 1..v_keys.COUNT遍历接收的列表,填充关联数组 - 结果返回:使用
cur.var()定义输出参数,让PL/SQL将计算后的键列表和计数器传递回Python
内容的提问来源于stack exchange,提问作者ChainSaw
相关产品推荐
相关产品推荐

