【问题标题】:JOOQ and Oracle REF CURSOR streamingJOOQ 和 Oracle REF CURSOR 流式传输
【发布时间】:2020-05-26 17:07:19
【问题描述】:

默认情况下,JOOQ 在生成的代码中将 REF CURSOR 输出参数包装为 Result<Record>

在某些情况下——对于大型报告,最好有记录流——Cursor<Record>Stream<Record>,而不是一次获取所有记录。

我们是否有可能更改此案例的生成代码或通过其他方式在 JOOQ 中为 REF CURSOR 实现 Record 的流式传输?

【问题讨论】:

    标签: java sql jooq


    【解决方案1】:

    恐怕目前(jOOQ 3.12)不可能。该区域有一些待处理的功能请求:

    • #4503org.jooq.Cursors extends Iterable<Cursor<Record>>
    • #4472 添加Routine.executeLazy() 以允许获取org.jooq.Cursors

    根据您使用的数据库产品,您可以将REF CURSOR 返回过程包装在一个表值函数中,并使用jOOQ 的ResultQuery.fetchLazy() 方法在普通的SELECT 语句中获取结果。这适用于 Oracle 和 PostgreSQL。

    【讨论】:

    • 我们可以使用 JOOQ 使用以下场景而不将 pl/sql 表包装在表函数中吗?使用Configuration.connectionProvider() 获取ConnectionProvider。使用ConnectionProvider.acquire() ConnectionProvider.release() 获取和释放javax.sql.Connection。用javax.sql.Connection 制作CallableStatement。使用 OracleTypes.CURSOR 注册 REF CUSOR out 参数。使用 DSLContext.fetchLazy 将来自 out 参数的 ResultSet 包装为 Cursor<Record>
    • Cursor<Record> 必须在 ConnectionProvider.acquire()ConnectionProvider.release() 调用之间使用
    • @aelor:我不太确定您在这里的建议是什么,但话说回来,Stack Overflow cmets 不是进行更复杂讨论的好媒体。我可以邀请您在用户组(groups.google.com/d/forum/jooq-user)或github(github.com/jOOQ/jOOQ/issues/new/choose)上提问吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    相关资源
    最近更新 更多