You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI结合cx_Oracle、SQLAlchemy调用Oracle存储过程的推荐方案咨询

存储过程调用及结果遍历的正确实现

你当前的核心问题是不符合cx_Oracle输出REF CURSOR参数的传递规范,修正后的调用逻辑如下:

@app.get('/')
def index(conn = Depends(get_connection)):
    # 使用上下文管理器自动回收游标,可省略手动close逻辑
    with conn.cursor() as cursor:
        # 声明类型为CURSOR的输出参数变量
        ref_cursor = cursor.var(cx_Oracle.CURSOR)
        # 参数顺序严格匹配存储过程的定义顺序,输出参数放在对应位置
        cursor.callproc("myprocedure", [ref_cursor, 112233])
        # 提取返回的游标结果
        result_cursor = ref_cursor.getvalue()
        # 遍历结果集
        for row in result_cursor:
            print(row)
        # 显式关闭返回的结果游标
        result_cursor.close()

注意:请提前确认存储过程的参数顺序和类型,确保第一个参数为OUT类型的SYS_REFCURSOR、第二个参数为NUMBER类型,和你传入的参数顺序完全匹配。

补充疑问解答
  • 你的实现方案是合理的。公共Engine单例、每个请求通过依赖获取独立连接、请求结束自动关闭连接的逻辑,完全匹配FastAPI的请求生命周期,配合你配置的cx_Oracle固定大小连接池、SQLAlchemy NullPool,既不会出现连接泄漏,也能保证连接复用效率。唯一需要注意的是你当前使用raw_connection获取原生cx_Oracle连接,不走SQLAlchemy会话管理,只要确保依赖的finally块中conn.close()正常执行即可。
  • 游标不需要强制手动关闭,所属连接关闭时cx_Oracle会自动回收所有关联游标资源。但如果单次请求创建多个游标、返回的结果集较大,建议显式关闭游标,可尽早释放数据库端和客户端的缓存资源,避免不必要的资源占用。也可以直接用上下文管理器包裹游标,退出时会自动执行关闭逻辑,不需要手动编写close代码。

内容的提问来源于stack exchange,提问作者Marcelo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 02:27:03