JMeter执行PostgreSQL存储过程报错:游标'refcur'不存在
PostgreSQL存储过程调用报错:游标"refcur"不存在的问题解决
问题根源
你直接在调用语句里传字符串'refcur'作为游标参数,但PostgreSQL会把这个字符串当作已存在的游标名称去查找,而你并没有提前声明这个游标,所以触发了"cursor does not exist"的错误。
正确调用方式分两种情况处理
情况1:存储过程用输出参数定义游标
如果你的存储过程是通过OUT类型的refcursor参数返回结果,比如存储过程定义类似:
CREATE OR REPLACE PROCEDURE appoagetincorrecthintitems( p_user_id INT, OUT result_cursor REFCURSOR ) LANGUAGE plpgsql AS $$ BEGIN OPEN result_cursor FOR SELECT * FROM your_table WHERE user_id = p_user_id; END; $$;
那JDBC Sampler的调用语句要改成:
CALL appoagetincorrecthintitems(3236006, ?);
然后在JDBC Sampler的「参数」配置里添加一条参数:
- 参数值留空
- 参数类型选择
REF_CURSOR - 参数方向设置为
OUT
这样JDBC驱动会自动处理游标,帮你获取存储过程返回的结果集。
情况2:存储过程要求传入游标名并手动打开
如果存储过程逻辑是需要你传入游标名,再由存储过程打开它,那你需要在同一个数据库会话中先声明游标,再调用存储过程,最后获取结果。具体步骤:
- 在JDBC Sampler的「Connection Configuration」里关闭「Auto Commit」
- 把以下语句放在同一个JDBC Request中执行:
BEGIN; DECLARE refcur REFCURSOR; CALL appoagetincorrecthintitems(3236006, 'refcur'); FETCH ALL FROM refcur; COMMIT;
这种方式需要手动管理事务,不如第一种方式简洁,建议优先采用输出参数的调用模式。
内容的提问来源于stack exchange,提问作者SanjayDVG
相关产品推荐
相关产品推荐

