gpt4 book ai didi

oracle - 使用 SqlAlchemy 执行返回 REF CURSOR 的 Oracle 存储过程

转载 作者:行者123 更新时间:2023-12-03 17:38:11 27 4
gpt4 key购买 nike

我有一个在 Oracle 中定义的存储过程。在那个过程中,我需要返回一个记录集。为此,我使用了 SYS_REFCURSOR ,它在 Oracle 内部工作得很好(就此而言,还有 cx_Oracle )。在我的应用程序中,我使用 SqlAlchemy 范围的 session 来支持多线程。

如何使用作用域 session 返回 REF CURSOR ?我能够让它工作的唯一方法是使用 session 中事件的游标声明一个输出游标,然后执行存储过程,如下所示:

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 Cursor 是存储执行 SQL 语句的指令的内存区域位置。 Ref 光标只是指向光标位置的指针。 SYS_REFCURSOR 是一个特定的 oracle 定义的引用游标类型。因此,当您将 SYS_REFCURSOR 变量返回给客户端时,您将返回一个指向执行 SQL 的指令所在的内存位置的指针。您的客户端现在可以使用 FETCH 操作执行指令并获取行。所以这是将结果集返回给客户端的最佳方式。
作为替代方案,您可以使用 PIPELINED FUNCTION,但我可以向您保证,您不会获得任何更好的性能。 AskTom 在这篇文章中对这个比较有很好的解释
https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:9532870400346178516
另一种情况是您是否要分析时间消耗的位置,无论是在 EXECUTE 阶段还是在 FETCH 阶段。如果您在 FETCH 中花费大量时间,也许您可​​以考虑以其他方式将数据传输到客户端。如果您在 EXECUTION 中遇到问题,那么您需要对您的程序进行调整练习。

关于oracle - 使用 SqlAlchemy 执行返回 REF CURSOR 的 Oracle 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8390212/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com