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

如何通过cx_Oracle从REF CURSOR中获取列名?

获取cx_Oracle存储过程返回游标的列名

我明白你遇到的困扰了——调用返回游标的存储过程时,常规的cursor.description拿不到列名,返回的Variable对象也直接取不了description。其实核心问题是你还没从返回的变量里提取出实际的游标对象,这才是能获取列名的关键!

解决方案步骤:

  • 当你通过callproc或者匿名块调用存储过程后,返回的游标变量(比如你的l_results)是一个cx_Oracle.Variable实例,不是真正的游标。你需要调用它的getvalue()方法,才能拿到内部封装的cx_Oracle.Cursor对象。
  • 这个实际的游标对象就会有正确的description属性,包含列名等元数据。

完整代码示例:

import cx_Oracle

# 假设你的db_class已经正确初始化连接
db = db_class()
conn = db.connect()
cursor = conn.cursor()

# 定义游标类型的输出变量
l_results = cursor.var(cx_Oracle.CURSOR)

# 调用存储过程
cursor.callproc("PROG.DATA.GET_EVENTS", [1, 2, l_results])

# 提取实际的游标对象
return_cursor = l_results.getvalue()

# 获取列名(从description中提取第一元素,即列名)
column_names = [col[0] for col in return_cursor.description]

# 读取数据
data = [row for row in return_cursor]

# 现在你有了列名和对应的数据
print("列名:", column_names)
print("数据:", data)

# 别忘了关闭游标和连接
return_cursor.close()
cursor.close()
conn.close()

为什么之前的方法无效?

  • cursor.description:主游标执行的是存储过程调用语句,不是SELECT查询,所以它的description自然是None,因为它本身没有关联查询结果集。
  • res[2]或l_results:这些都是Variable对象,是用来传递参数的容器,不是游标实例,所以直接访问description会报错,必须用getvalue()取出内部的游标。

如果你用匿名块的方式调用,逻辑也是一样的:

res = cursor.execute("BEGIN PROG.DATA.GET_EVENTS(:1,:2,:3); END;", {"1": 1,"2": 2,"3": l_results})
return_cursor = l_results.getvalue()
column_names = [col[0] for col in return_cursor.description]

这样就能顺利拿到列名和对应的数据啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:18:08