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
相关产品推荐
相关产品推荐

