Python pandas中执行Oracle存储过程并直接转换为DataFrame的方法咨询
问题解答
核心结论
pandas 目前没有原生提供直接执行Oracle存储过程并自动将返回游标转换为DataFrame的内置功能。
原因是不同数据库的存储过程调用、返回值规则差异极大:比如Oracle需要绑定游标类型的输出参数、SQL Server存储过程可能返回多结果集/输出参数混合、MySQL存储过程的调用逻辑又有区别,pandas内置的read_sql/read_sql_query系列方法仅支持标准SQL查询的执行和结果转换,无法兼容各类数据库特有的存储过程调用逻辑。
现有代码优化建议
你当前的实现逻辑是标准可行的,可以补充获取表头的逻辑,避免导出的Excel没有列名:
import cx_Oracle import pandas as pd from datetime import datetime cur = con.cursor() myvar = cur.var(cx_Oracle.CURSOR) cur.callfunc(func_name, myvar, param_list) # 拿到返回的游标对象 res_cursor = myvar.getvalue() # 同时获取数据和列名 data = res_cursor.fetchall() columns = [col[0] for col in res_cursor.description] # 构造带表头的DataFrame df = pd.DataFrame(data, columns=columns) date = datetime.now().strftime("%Y_%m_%d_%I_%M_%S_%p") xlsfilename = f"STOCK_DETAIL_REPORT_{filepart}_{date}.xlsx" writer = pd.ExcelWriter(xlsfilename, engine='xlsxwriter') # 此处可开启header参数导出列名 df.to_excel(writer, sheet_name=func_name.split(".")[1], header=True, index=False) writer.save()
可复用封装思路
如果需要频繁调用存储过程拿结果,可以自行封装通用函数减少重复代码:
def call_oracle_proc(con, proc_name, params) -> pd.DataFrame: cur = con.cursor() out_cursor = cur.var(cx_Oracle.CURSOR) cur.callfunc(proc_name, out_cursor, params) res_cur = out_cursor.getvalue() data = res_cur.fetchall() cols = [desc[0] for desc in res_cur.description] cur.close() return pd.DataFrame(data, columns=cols)
内容的提问来源于stack exchange,提问作者Praveen Mishra
相关产品推荐
相关产品推荐

