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

Python操作Oracle时如何动态遍历自定义PL/SQL类型返回的记录集合

cx_Oracle调用Oracle存储过程返回集合转列表字典的实现方案

不需要自行实现底层迭代器,cx_Oracle原生提供了动态读取自定义RECORD类型字段的接口,你只需要基于现有接口封装通用转换方法即可。

通用转换代码

import cx_Oracle as co

def oracle_collection_to_list(collection):
    """将Oracle返回的自定义类型集合转换为Python列表套字典格式"""
    result = []
    ix = collection.first()
    while ix is not None:
        record = collection.getelement(ix)
        # 动态遍历RECORD的所有字段,不需要提前知道字段名
        record_dict = {attr.name: getattr(record, attr.name) for attr in record.type.attributes}
        result.append(record_dict)
        ix = collection.next(ix)
    return result

# 调用示例
CONN_STR = "你的Oracle连接串"
conn = co.connect(CONN_STR)
with conn.cursor() as cursor:
    collection_type = conn.gettype("CHB_PYTHONTEST.PYTHON_TEST_TAB")
    collection = collection_type.newobject()
    cursor.callproc("Chb_pythontest.Test_output_collection", [1, collection])          
    # 转换后即可直接操作Python原生格式数据
    res_list = oracle_collection_to_list(collection)
    # 测试打印
    for row in res_list:
        print(row)

核心逻辑说明

  • cx_Oracle返回的RECORD实例自带type.attributes属性,存储了该RECORD类型的所有字段元信息,遍历该属性即可拿到全部字段名,不需要提前硬编码字段
  • 用getattr()方法即可通过字段名动态获取对应值,无需显式引用字段
  • 该方法对所有自定义RECORD类型的集合都通用,无需针对不同返回结构修改代码

可选优化

如果需要将Oracle返回的大写字段名转为小写下划线格式,可在生成字典时修改字段名处理逻辑:

record_dict = {attr.name.lower(): getattr(record, attr.name) for attr in record.type.attributes}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:45:04