使用SqlAlchemy执行Oracle存储过程返回REF游标

使用SqlAlchemy执行Oracle存储过程返回REF游标,oracle,stored-procedures,sqlalchemy,Oracle,Stored Procedures,Sqlalchemy,我在Oracle中定义了一个存储过程。在这个过程中,我需要返回一个记录集。为此,我使用的是SYS\u REFCURSOR,它在Oracle内部非常有效(就这一点而言,它与cx\u Oracle)。在我的应用程序中,我使用SqlAlchemy作用域会话来支持多线程 如何使用作用域会话返回REF光标?我能够实现这一点的唯一方法是使用会话中处于活动状态的游标声明一个out游标,然后执行存储过程,如下所示: sql = """ BEGIN example('%s', '%s',

我在Oracle中定义了一个存储过程。在这个过程中,我需要返回一个记录集。为此,我使用的是
SYS\u REFCURSOR
,它在Oracle内部非常有效(就这一点而言,它与
cx\u Oracle
)。在我的应用程序中,我使用SqlAlchemy作用域会话来支持多线程

如何使用作用域会话返回
REF光标
?我能够实现这一点的唯一方法是使用会话中处于活动状态的游标声明一个out游标,然后执行存储过程,如下所示:

sql = """
    BEGIN
        example('%s', '%s', '%s', :cur);
    END;
""" % (cid, show, type)

conn = sa_tool.session.connection()
in_cur = conn._Connection__connection.cursor()
out_cur = conn._Connection__connection.cursor()
in_cur.execute(sql, cur=out_cur)
results = out_cur.fetchall()
理想情况下,我希望避免以这种方式使用连接对象,并在让SqlAlchemy管理游标的同时执行该过程。如果这是不可能的,是否有理由提取会花费这么长时间


谢谢

我看到这个问题没有得到回答,我决定跳进去。首先,我要说的是,对于您的场景,没有比SYS_REFCURSOR更好的选项了。当然,你还有其他选择

Oracle游标是存储执行SQL语句的指令的内存区域位置。Ref游标只是指向游标位置的指针。SYS_REFCURSOR是一个特定的oracle定义的ref cursor类型。因此,当您向客户机返回SYS_REFCURSOR变量时,您将返回指向执行SQL指令所在的内存位置的指针。客户机现在可以使用FETCH操作执行指令并获取行。因此,这是向客户机返回结果集的最佳方式

作为替代方案,您可以使用流水线函数,但我可以向您保证,您不会获得更好的性能。AskTom在本文中对这种比较有很好的解释


另一种情况是,您是否要分析在执行阶段或获取阶段消耗时间的位置。如果您有大量的时间来获取,也许您可以考虑将数据以另一种方式传递给客户端。如果在执行过程中遇到问题,则需要对过程进行调优。

速度慢肯定是我自己的错,而且是存储过程中的错误查询。问题仍然存在,在SqlAlchemy中是否有更好的方法使用Oracle
REF游标调用存储过程?