创建存储过程后红移游标不存在

Posted

技术标签:

【中文标题】创建存储过程后红移游标不存在【英文标题】:Redshift cursor doesn't exist after creating a stored procedure 【发布时间】:2021-06-17 21:04:35 【问题描述】:

我按照 aws redshift 文档创建存储过程并使用游标返回数据结果。即使我与文档完全相同,它也会引发错误,指出光标不存在。不确定我是否遗漏了一个步骤,或者我需要在我的 redshift 实例中为我的用户名打开一些设置。

这是我的查询;

CREATE OR REPLACE PROCEDURE test_procedure (param IN varchar(max), rs_out INOUT refcursor)
AS $$
BEGIN
  OPEN rs_out FOR SELECT * FROM test_db where id=param;
END;
$$ LANGUAGE plpgsql;

BEGIN;
CALL test_procedure('id_1','mycursor');
FETCH ALL FROM mycursor;
COMMIT;

这是 aws 文档以供参考; https://docs.aws.amazon.com/redshift/latest/dg/stored-procedure-result-set.html

【问题讨论】:

test_db 是一张桌子吗? 这是一个mview! @MaxGanzII 您能否确认您的工作台未处于“自动提交”模式?此设置将使您退出事务并关闭光标 我尝试了自动和手动交易模式......这没有任何区别@BillWeiner 【参考方案1】:

我运行了您的代码(更改名称以便您也可以运行它)并且一切正常。

代码:

drop table if exists test_proc;
create table test_proc ( txt varchar(32), num int, id varchar(8));
insert into test_proc values ('this is text', 5, 'id_1');
insert into test_proc values ('this is also text', 6, 'id_2');
commit;

select * from test_proc;

CREATE OR REPLACE PROCEDURE test_procedure (param IN varchar(max), rs_out INOUT refcursor)
AS $$
BEGIN
  OPEN rs_out FOR SELECT * FROM test_proc where id=param;
END;
$$ LANGUAGE plpgsql;

BEGIN;
CALL test_procedure('id_1','mycursor');
FETCH 1000 FROM mycursor;
COMMIT;

select * from svl_statementtext where pid = pg_backend_pid() order by starttime desc limit 100;

我认为问题不在于代码,而在于您的交易过早结束。您可以尝试运行此代码以查看是否得到不同的结果,但我预计您会遇到问题。

注意到最后一个语句了吗?这将按会话 (pid) 列出所有命令问题。重要的是 CALL 和 FETCH(将显示为“SELECT * FROM test_proc where id= $1” - 带有前导空格)具有相同的 XID(事务 id)。如果他们不这样做,那么光标将不存在。在这种情况下,您还将在这些语句之间看到导致事务关闭的 COMMIT。这表明您的工作台正在“自动提交”模式下连接到 Redshift,并在每个“;”处插入一个提交。如何将工作台配置为不处于自动提交模式因工作台而异。

【讨论】:

以上是关于创建存储过程后红移游标不存在的主要内容,如果未能解决你的问题,请参考以下文章

数据库基础详解:存储过程、视图、游标、SQL语句优化以及索引

MySQL 存储过程,获取使用游标查询的结果集

MySQL必知必会读书笔记-8(表的操纵,视图,存储过程,游标,触发器)

带游标的Mysql存储过程

mysql 存储过程怎么赋值?

mysql 存储过程