从 redshift 存储过程返回结果集

Sim*_*onB 5 python postgresql psycopg2 amazon-web-services amazon-redshift

我有一个使用游标方法返回记录集的过程:

CREATE OR REPLACE PROCEDURE myschema.permissions_sp(rs_out INOUT refcursor)
 LANGUAGE plpgsql
 SECURITY DEFINER
AS $$
BEGIN
  OPEN rs_out FOR select schema_name,schema_owner,grantee_type,grantee,p_usage,p_create,object_name,perms,p_select,p_update,p_insert,p_delete,p_truncate,p_references,p_trigger,p_rule from xxxx.myview;
END;
$$ 
/
GRANT EXECUTE on PROCEDURE myschema.permissions_sp(INOUT refcursor)  TO xxxx_user
/
Run Code Online (Sandbox Code Playgroud)

我可以使用我的管理员登录名在工作台上完美地调用它。

BEGIN;
CALL meta.permissions_sp('apples'); 
COMMIT;
Run Code Online (Sandbox Code Playgroud)

结果是 16 列 x >7k 行的数据集

(说实话,我什至不需要做交易部分,它只需使用 CALL 就可以正常运行)

然而,当我通过 psycopg2 调用它时,会发生以下情况:

cur = conn.cursor()
cur.execute("CALL meta.permissions_sp('apples');")
conn.commit()
rows = cur.fetchall()
print('rows:%s' % (rows))
Run Code Online (Sandbox Code Playgroud)

输出:

> rows:[('apples',)]
Run Code Online (Sandbox Code Playgroud)

我尝试过使用提交而不是使用它。只是真的很难理解发生了什么。在这个阶段,不确定这是否是我从 Python 调用的方式,或者是在 Redshift 方面的调用方式。

任何指导表示赞赏!

sna*_*erb 3

该过程接收一个名称作为其参数,并返回具有该名称的服务器端游标。在客户端,调用该过程后,必须声明一个具有相同名称的命名游标并使用它来访问查询结果。您必须在提交连接之前执行此操作,否则服务器端游标将被破坏。

with psycopg2.connect(dbname='test') as conn:
    cur = conn.cursor()
    cur.execute("""CALL myschema.permissions_sp('mycursor')""")
    
    # Use the name that was passed to the procedure.
    named_cursor = conn.cursor('mycursor')
    for row in named_cursor.fetchall():
        print(row)
Run Code Online (Sandbox Code Playgroud)

这类似于如何在 psql 控制台中获取结果,如Redshift 文档中所述:

BEGIN;
CALL myschema.permissions_sp('mycursor');
FETCH ALL FROM mycursor;
COMMIT;
Run Code Online (Sandbox Code Playgroud)