使用游标在python中调用存储过程

Posted

技术标签:

【中文标题】使用游标在python中调用存储过程【英文标题】:call stored procedure in python using cursor 【发布时间】:2020-09-17 01:57:21 【问题描述】:

只要在数据库中添加了新的表模式,redshift 中的数据就会发生变化。我正在尝试获取 information_schema.tables 中的所有 table_schema 名称。

所以我创建了一个使用游标方法返回不同 table_schema 名称的存储过程。现在我希望它使用 python 调用我的项目。

存储过程:

CREATE OR REPLACE PROCEDURE get_dist_schema(rsout INOUT refcursor)
AS $$
BEGIN 
  OPEN rsout FOR SELECT DISTINCT table_schema FROM information_schema.tables;
END;
$$ LANGUAGE plpgsql;

//this is used in the database to fetch all rows
BEGIN;
CALL get_dist_schema('sname');
FETCH ALL FROM sname;

commit;

python.py

def call_dist_name(sname):
    conn = None

    try:
        params = config()
        conn = psycopg2.connect(**params)
        cur = conn.cursor()

        cur.execute('CALL get_dist_schema(%s)' % sname)

        conn.commit()
        result = cur.fetchall()
        for row in result:
                print(row[0])
        cur.close()



    except(Exception, psycopg2.DatabaseError) as error:
        print(error)

    finally:
        if conn is not None:
            conn.close()    


if __name__ == '__main__':
    call_dist_name('sname')

错误:“sname”列不存在。

如何在我的项目中获取存储过程中的显示结果集?

【问题讨论】:

【参考方案1】:

我认为问题在于传递给存储过程的值 (sname) 没有被引用:

cur.execute('CALL get_dist_schema(%s)' % sname)

通过替换变量,它将导致:

cur.execute('CALL get_dist_schema(sname)')

应该是这样的:

cur.execute("CALL get_dist_schema('sname')")

因此,将行改为:

cur.execute("CALL get_dist_schema('%s')" % sname)

【讨论】:

以上是关于使用游标在python中调用存储过程的主要内容,如果未能解决你的问题,请参考以下文章

mysql中存储过程和游标调用问题

Oracle数据库存储过程中输出参数为自定义游标类型时,使用call或者exec调用时,用啥来给游标赋值

调用存储过程的Oracle游标循环

oracle存储过程返回游标,取值报错

Oracle 存储过程调用返回游标的另一个存储过程。

使用JPA调用存储过程,返回存储多行数据的OUT参数(游标)