Redshift存储过程返回游标报错问题求助
Redshift存储过程返回游标报错问题及解决
问题场景
创建了返回游标的Redshift存储过程,在事务中调用时触发两个错误,无结果返回:
存储过程代码
CREATE OR REPLACE PROCEDURE sp_my_test_sp ( rs_out INOUT refcursor ) as $$ BEGIN OPEN rs_out FOR select 'TestValue' Field1; END $$ LANGUAGE plpgsql
调用代码
BEGIN; CALL sp_my_test_sp('mycursor'); FETCH 100 FROM mycursor; COMMIT;
报错信息
- 错误1:
ERROR: 当前事务已中止,事务块结束前忽略后续命令 [ErrorId: 1-63efe90b-09bf32ed3f42e3367ce3fd1c] - 错误2:
ERROR: 游标 "mycursor" 不存在 [ErrorId: 1-63efe8cf-40c497f3251106b0061d1485]
问题原因及解决方法
触发顺序说明
错误2先触发:调用存储过程时传递的是纯字符串,Redshift无法将其识别为合法的refcursor类型,导致存储过程未能成功打开指定游标;随后执行FETCH命令时,因游标不存在报错,进而触发错误1(事务因前序命令失败中止,后续命令被忽略)。
修复方案
方案1:显式转换参数类型
调用存储过程时,将字符串参数转换为refcursor类型:
BEGIN; CALL sp_my_test_sp('mycursor'::refcursor); FETCH 100 FROM mycursor; COMMIT;
方案2:提前声明游标变量
先声明refcursor类型变量,再传入存储过程:
BEGIN; DECLARE mycursor refcursor; CALL sp_my_test_sp(mycursor); FETCH 100 FROM mycursor; COMMIT;
两种方案都能确保存储过程正确识别游标参数,成功打开游标并在事务内供FETCH命令调用。
内容的提问来源于stack exchange,提问作者dzhukov
相关产品推荐
相关产品推荐

