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

Python调用PL/SQL存储过程时如何同时获取列名与数据

嘿,我来帮你搞定获取列名的问题!你现在用fetchall()只能拿到纯数据数组,是因为这个方法本来就只返回行数据,而列名其实藏在你拿到的那个REF_CURSOR对象的description属性里哦。

接下来一步步给你讲怎么做:

1. 先单独取出REF_CURSOR对象

你通过callproc得到的result_set里,对应OUT参数的那个元素就是REF_CURSOR对象,先把它单独拎出来:

result_set = self.__cursor__.callproc(call_procedure, parameters)
ref_cursor = result_set[index]  # index是你的OUT参数在parameters列表里的位置

2. 从REF_CURSOR中提取列名

ref_cursor.description是一个列表,每个元素是一个元组,元组的第一个值就是对应的列名。我们用列表推导式就能快速提取出所有列名:

column_names = [col[0] for col in ref_cursor.description]

顺便说下,这个元组里还包含列的类型、长度等其他元数据,结构是(列名, 类型码, 显示长度, 内部长度, 精度, 刻度, 是否允许为空),按需取用就行。

3. 把数据和列名结合(可选但超实用)

如果想让数据更直观好读,比如转换成字典列表(每个字典的键是列名,值是对应的数据),可以这么做:

rows = ref_cursor.fetchall()
result_dicts = [dict(zip(column_names, row)) for row in rows]

这样你拿到的result_dicts里的每一项都是清晰的字典,比如{"FIRST_NAME": "John", "MIDDLE_INITIAL": "B", ...},后续处理数据会方便很多。

完整参考示例

给你一个更完整的代码片段,假设你的存储过程是用来查询用户信息的:

# 调用存储过程并获取REF_CURSOR
result_set = self.__cursor__.callproc("get_user_info", [user_id, cx_Oracle.CURSOR])
ref_cursor = result_set[1]  # 这里假设OUT参数是第二个位置,索引为1

# 提取列名
column_names = [col[0] for col in ref_cursor.description]
# 获取所有数据行
data_rows = ref_cursor.fetchall()
# 格式化为字典列表
formatted_result = [dict(zip(column_names, row)) for row in data_rows]

# 记得用完关闭游标
ref_cursor.close()

print(formatted_result)

需要注意的是,哪怕REF_CURSOR里没有返回任何数据,description依然会包含列名信息,只要存储过程里的SELECT语句明确指定了列(不管有没有匹配到数据)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:02:49