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
相关产品推荐
相关产品推荐

