OracleDB中如何动态获取REF CURSOR输出列名?解决AttributeError
解决OracleDB中动态获取REF CURSOR输出列名的问题
问题原因
你遇到的AttributeError是因为ref_cursor是Var对象(通常通过cursor.var(oracledb.CURSOR)或cursor.var(cx_Oracle.CURSOR)创建),它本身并不具备游标对象的description属性,必须先提取出内部实际的游标实例才能获取列元数据。
正确实现步骤
- 执行存储过程后,通过
ref_cursor.getvalue()获取实际的游标对象 - 从该游标对象中读取
description属性提取列名 - 最后从游标中获取数据并转换为DataFrame
修正后的代码示例
# 假设已初始化cursor和ref_cursor(比如ref_cursor = cursor.var(oracledb.CURSOR)) cursor.execute("BEGIN GET_Transaction_History(:date_value, :cursor); END;", date_value=date_value, cursor=ref_cursor) # 获取实际的游标实例 actual_cursor = ref_cursor.getvalue() # 动态提取列名 column_names = [desc[0] for desc in actual_cursor.description] # 获取数据并构建DataFrame df = pd.DataFrame(actual_cursor.fetchall(), columns=column_names)
补充说明
- 若使用旧版
cx_Oracle驱动,代码逻辑完全一致,仅需将oracledb替换为cx_Oracle即可 - 调用
actual_cursor.fetchall()会一次性获取所有数据,若数据量极大,建议改用分批读取(如fetchmany(size=1000))避免内存溢出
内容的提问来源于stack exchange,提问作者TourEiffel
相关产品推荐
相关产品推荐

