Redshift存储过程调用报错,如何在控制台传递refcursor名称?
解决Redshift存储过程refcursor调用及format函数错误问题
正确传递refcursor名称的调用方式
Redshift中调用带有refcursor类型INOUT参数的存储过程,需要在显式事务内传递游标名称并后续抓取结果,以下是两种可行方式:
1. 自定义游标名称调用
BEGIN; -- 传递自定义游标名称'my_result_cursor'给INOUT参数rs_out CALL test_schema.get_redshift_table_ddl('my_result_cursor'); -- 抓取游标内的所有结果 FETCH ALL FROM my_result_cursor; -- 关闭游标(可选,但推荐) CLOSE my_result_cursor; END;
注意:需将整个事务块(从BEGIN到END)选中后一次性执行,不要分步运行。
2. 使用默认游标名称调用
如果存储过程为rs_out参数设置了默认值(例如DEFAULT 'rs_out'),可以省略参数直接调用:
BEGIN; CALL test_schema.get_redshift_table_ddl(); FETCH ALL FROM rs_out; CLOSE rs_out; END;
关于format函数不存在的错误排查
你遇到的ERROR: function format(character varying, character varying, character varying) does not exist错误,和refcursor调用无关,问题出在存储过程内部的format函数使用上:
- 检查
format调用的参数数量:Redshift的format函数第一个参数是格式字符串,后续是对应占位符的参数,确保占位符数量和参数数量匹配。 - 检查参数类型兼容性:
format函数要求参数为text类型,如果你的变量是varchar,可以显式转换,例如format('SELECT * FROM %I.%I', schema_name::text, table_name::text)。 - 确认Redshift版本:虽然现代Redshift版本都支持
format函数,但如果是极旧版本,可能需要升级或改用字符串拼接(不推荐,存在SQL注入风险)。
内容的提问来源于stack exchange,提问作者riyaB
相关产品推荐
相关产品推荐

