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

OracleDB中如何动态获取REF CURSOR输出列名?解决AttributeError

解决OracleDB中动态获取REF CURSOR输出列名的问题

问题原因

你遇到的AttributeError是因为ref_cursor是Var对象(通常通过cursor.var(oracledb.CURSOR)或cursor.var(cx_Oracle.CURSOR)创建),它本身并不具备游标对象的description属性,必须先提取出内部实际的游标实例才能获取列元数据。

正确实现步骤

  1. 执行存储过程后,通过ref_cursor.getvalue()获取实际的游标对象
  2. 从该游标对象中读取description属性提取列名
  3. 最后从游标中获取数据并转换为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:12:08