从 redshift 存储过程返回结果集
Returning result set from redshift stored procedure
我有一个程序 returns 使用游标方法的记录集:
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
/
而且我可以使用我的管理员登录名从 workbench 调用它。
BEGIN;
CALL meta.permissions_sp('apples');
COMMIT;
结果是一个 16 列 x >7k 行的数据集
(老实说,我什至不需要做交易部分,它 运行 只用 CALL 就好了)
但是,当我通过 psycopg2 调用它时,会发生以下情况:
cur = conn.cursor()
cur.execute("CALL meta.permissions_sp('apples');")
conn.commit()
rows = cur.fetchall()
print('rows:%s' % (rows))
输出:
> rows:[('apples',)]
我试过使用提交和不使用它。
只是真的很难理解发生了什么。
在这个阶段不确定我是如何从 Python 调用的,还是在 Redshift 方面。
感谢任何指导!
该过程接收一个名称作为其参数,returns 一个具有该名称的服务器端游标。在客户端,调用该过程后,您必须声明一个具有相同名称的 named cursor 并使用它来访问查询结果。您必须在提交连接之前执行此操作,否则服务器端游标将被破坏。
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)
这类似于您在 psql 控制台中获取结果的方式,如 Redshift docs:
中所述
BEGIN;
CALL myschema.permissions_sp('mycursor');
FETCH ALL FROM mycursor;
COMMIT;
我有一个程序 returns 使用游标方法的记录集:
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
/
而且我可以使用我的管理员登录名从 workbench 调用它。
BEGIN;
CALL meta.permissions_sp('apples');
COMMIT;
结果是一个 16 列 x >7k 行的数据集
(老实说,我什至不需要做交易部分,它 运行 只用 CALL 就好了)
但是,当我通过 psycopg2 调用它时,会发生以下情况:
cur = conn.cursor()
cur.execute("CALL meta.permissions_sp('apples');")
conn.commit()
rows = cur.fetchall()
print('rows:%s' % (rows))
输出:
> rows:[('apples',)]
我试过使用提交和不使用它。 只是真的很难理解发生了什么。 在这个阶段不确定我是如何从 Python 调用的,还是在 Redshift 方面。
感谢任何指导!
该过程接收一个名称作为其参数,returns 一个具有该名称的服务器端游标。在客户端,调用该过程后,您必须声明一个具有相同名称的 named cursor 并使用它来访问查询结果。您必须在提交连接之前执行此操作,否则服务器端游标将被破坏。
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)
这类似于您在 psql 控制台中获取结果的方式,如 Redshift docs:
中所述BEGIN;
CALL myschema.permissions_sp('mycursor');
FETCH ALL FROM mycursor;
COMMIT;