使用redshift_connector调用Redshift存储过程无法获取DataFrame数据
Redshift存储过程调用后无法获取结果数据的解决方法
问题分析
调用Redshift存储过程后仅返回游标名称(如mycursor),是因为refcursor类型的输出参数只是一个游标标识,需要额外执行FETCH语句才能读取游标指向的结果集,直接用fetchall()无法获取存储过程内部查询的数据。
解决步骤
- 调用存储过程后,执行
FETCH ALL FROM <游标名>语句,让当前游标指向存储过程返回的结果集 - 再通过
fetchall()获取数据,最后转换为DataFrame
修改后的Python代码
import redshift_connector import pandas as pd conn = redshift_connector.connect( host='xyz.xyz.region.redshift.amazonaws.com', database='db', port=5439, user="user", password='p@@s' ) cursor = conn.cursor() try: cursor.execute("BEGIN;") # 调用存储过程,传入参数和游标名 cursor.callproc("reporting.procedure", parameters=[1, 'mycursor']) # 显式从游标中获取所有数据 cursor.execute("FETCH ALL FROM mycursor;") # 获取结果集 result_data = cursor.fetchall() # 转换为DataFrame(假设结果列名为a) df = pd.DataFrame(result_data, columns=['a']) print(df) finally: cursor.execute("COMMIT;") cursor.close() conn.close()
关键说明
callproc方法返回的是传入的参数列表(这里就是[1, 'mycursor']),所以直接拿它的返回值得不到数据- 必须执行
FETCH语句来关联refcursor对应的结果集,之后才能用fetchall()读取数据 - 如果需要多次读取或者分页,可以用
FETCH <行数> FROM mycursor,而不是ALL
内容的提问来源于stack exchange,提问作者marcin2x4
相关产品推荐
相关产品推荐

