You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 06:06:45