用于 oracle 12c 和 oracle 19c 中的引用游标的 Jooq 代码生成类

Posted

技术标签:

【中文标题】用于 oracle 12c 和 oracle 19c 中的引用游标的 Jooq 代码生成类【英文标题】:Jooq codegen classes for ref-cursor on oracle12 and oracle19 【发布时间】:2021-06-12 15:34:22 【问题描述】:

我在包上下文中有 plsql 代码:

type t_demand_for_excel_upload is record
(
    bsns_oper_name t_string,
    demand_date date,
    demand_hour integer,
    demand_value number
);
type t_cur_demands_for_excel_upload is ref cursor return t_demand_for_excel_upload;

procedure get_demands_for_excel_upload
(
    p_calc_version_id in integer,
    p_shop_id in integer,
    p_start_date in date,
    p_end_date in date,
    p_result out t_cur_demands_for_excel_upload
);

Jooq 版本:

<jooq.groupId>org.jooq.pro</jooq.groupId>
<jooq.version>3.12.3</jooq.version>
<jooq.generator.db.dialect>org.jooq.meta.oracle.OracleDatabase</jooq.generator.db.dialect>

当我使用 oracle 12c 生成代码时 - 没关系,它在 java 中看起来像这样:

public static Result<Record> getDemandsForExcelUpload(Configuration configuration, BigInteger pCalcVersionId, BigInteger pShopId, LocalDate pStartDate, LocalDate pEndDate) 
        GetDemandsForExcelUpload f = new GetDemandsForExcelUpload();
        f.setPCalcVersionId(pCalcVersionId);
        f.setPShopId(pShopId);
        f.setPStartDate(pStartDate);
        f.setPEndDate(pEndDate);

        f.execute(configuration);
        return f.getReturnValue();
    

Result&lt;Record&gt; 如我所料。

在 Maven 中调试:

在 oracle 19c 上生成的代码如下所示:

public static TDemandForExcelUploadRecord getDemandsForExcelUpload(Configuration configuration, BigInteger pCalcVersionId, BigInteger pShopId, LocalDate pStartDate, LocalDate pEndDate) 
        GetDemandsForExcelUpload f = new GetDemandsForExcelUpload();
        f.setPCalcVersionId(pCalcVersionId);
        f.setPShopId(pShopId);
        f.setPStartDate(pStartDate);
        f.setPEndDate(pEndDate);

        f.execute(configuration);
        return f.getReturnValue();
    
public class TDemandForExcelUploadRecord extends UDTRecordImpl<TDemandForExcelUploadRecord> implements Record4<String, LocalDate, BigInteger, BigDecimal>  ...

我的光标在哪里?请帮忙。

Oracle 19c 的 Maven 调试:

jooq 设置在两种情况下都是相同的

【问题讨论】:

这看起来像是 github.com/jOOQ/jOOQ/issues/7861 引入的错误。我会尽快对此进行调查并提供更多信息。 如果我将返回类型 t_cur_demands_for_excel_upload 更改为 sys_refcursor 它工作得很好。 是的,这是一种解决方法 @LukasEder 有什么消息吗? 【参考方案1】:

这似乎是 jOOQ 3.14 中的一个错误,或者说是缺少的功能。我们没有针对强类型REF CURSOR 类型进行任何集成测试,因此我们没有注意到这种回归。我为此创建了两个问题:

https://github.com/jOOQ/jOOQ/issues/11708 添加对类型化 REF CURSOR 类型的支持的功能请求 https://github.com/jOOQ/jOOQ/issues/11709 在 3.15.0 和 3.14.9 实现功能请求之前恢复到旧行为的错误。如果您需要在较早的补丁版本中进行修复,请通过商业支持渠道与我们联系。

【讨论】:

以上是关于用于 oracle 12c 和 oracle 19c 中的引用游标的 Jooq 代码生成类的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 12c 多租户家族(12c 18c 19c)如何在 PDB 中添加 HR 模式

由于 Oracle DB 从 12c 升级到 19c,对现有 SQL、PL/SQL 脚本和数据模型有何影响?

Oracle 12c文档,用于SQL的更改/新功能

Oracle12c 之后的路线图

Oracle数据库安装配置详细教程汇总(含11g12c18c19c21c)

使用 Oracle 11g 客户端连接到 Oracle 19C 服务器