调用含refcursor的Redshift存储过程出现行与表头数量不匹配报错
问题分析与解决方案
报错Number of cells in the row (0) does not match number of headers (1)并非存储过程代码语法错误,大概率是AWS Redshift Query Editor v2对refcursor类型返回值的解析逻辑导致的兼容性问题。
解决办法
1. 使用psql客户端执行调用
Redshift官方psql客户端对refcursor的处理更贴合PostgreSQL标准行为,操作步骤如下:
- 通过psql连接到你的Redshift集群
- 执行以下SQL语句:
BEGIN; CALL get_result_set('mycursor'); FETCH ALL FROM mycursor; COMMIT;
此方式可正常返回sales表的结果集。
2. 改用直接返回结果集的存储过程写法
若无需显式使用游标,可修改存储过程,直接返回查询结果,适配Query Editor v2:
CREATE OR REPLACE PROCEDURE get_result_set() AS $$ BEGIN SELECT * FROM sales; END; $$ LANGUAGE plpgsql;
调用时执行CALL get_result_set();即可直接获取数据。
3. 调整Query Editor v2中的调用语法
若必须在Query Editor v2中使用refcursor,尝试通过声明游标变量的方式调用:
DECLARE mycursor refcursor; BEGIN; CALL get_result_set(mycursor); FETCH ALL FROM mycursor; COMMIT;
部分场景下可规避工具的元数据解析错误。
额外验证
- 确认执行存储过程的用户拥有
sales表的SELECT权限及存储过程的EXECUTE权限 - 再次确认
sales表存在列及数据(你已完成此验证)
内容的提问来源于stack exchange,提问作者Lior Inerman
相关产品推荐
相关产品推荐

