单节点Redshift执行FETCH NEXT时仍触发FETCH ALL不支持错误求助
单节点Redshift调用存储过程时FETCH语法报错问题
使用SQL Workbench/J操作单节点Redshift(规格dc2.large,节点数1)时遇到异常:明明按照AWS官方文档要求,使用了单节点必须的FETCH NEXT语法调用返回游标的存储过程,却依然报错。尝试改用FORWARD 1、FORWARD 0也无法解决。
报错信息
错误:单节点集群不支持Fetch ALL操作。请指定获取行数(单节点集群最大为1000),或升级到多节点集群。
存储过程及调用代码
CREATE OR REPLACE PROCEDURE public.sp_proc_with_in_var_two (f1 VARCHAR, rs_out INOUT refcursor) AS$$ BEGIN RAISE INFO 'f1 = %',f1; OPEN rs_out FOR SELECT f1 as v; END; $$ LANGUAGE plpgsql; /BEGIN; CALL public.sp_proc_with_in_var_two('my_val_to_show','mycur'); FETCH NEXT 1 FROM mycur; COMMIT;
环境配置
- Redshift集群:单节点,规格dc2.large
- 客户端工具:SQL Workbench/J(版本12.2 build 1290)
- JDBC驱动:Redshift JDBC 4.2 Driver 2.1.0.14
解决方案
问题出在SQL Workbench/J的默认游标处理行为上:工具会自动在执行完你写的FETCH NEXT 1后,额外执行一次FETCH ALL来获取剩余数据,这就触发了单节点Redshift的限制。
有两种解决方式:
修改SQL Workbench/J游标设置
- 打开连接属性,切换到「ResultSet」选项卡
- 勾选「Use 'FETCH n' instead of 'FETCH ALL'」,设置行数为1000(单节点集群上限)
- 保存设置后重新连接集群,再执行调用代码即可
替换游标为直接返回结果集
如果业务不需要游标,可以修改存储过程直接返回查询结果,规避游标操作:CREATE OR REPLACE PROCEDURE public.sp_proc_with_in_var_two (f1 VARCHAR) AS$$ BEGIN RAISE INFO 'f1 = %',f1; SELECT f1 as v; END; $$ LANGUAGE plpgsql; -- 调用简化为: CALL public.sp_proc_with_in_var_two('my_val_to_show');
内容的提问来源于stack exchange,提问作者marcin2x4
相关产品推荐
相关产品推荐

