如何通过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
相关产品推荐
相关产品推荐

