创建存储过程后红移游标不存在
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语句优化以及索引