【问题标题】:Default Values in Oracle FunctionsOracle 函数中的默认值
【发布时间】:2019-09-12 13:56:00
【问题描述】:

假设以下函数声明:

FUNCTION ARTTEXTJN
(p_art_id     in number
,p_arttextart in varchar2 default 'basis'
,p_sprache    in varchar2 default null
,p_aufart     in number   default null
,p_fallback_arttextart in varchar2  default 'J' 
)
RETURN VARCHAR2

期望第一个参数所有参数都有一个默认值。

jOOQ 生成一个这样的包方法:

public static Field<String> arttextjn(Field<? extends Number> pArtId, Field<String> pArttextart, 
              Field<String> pSprache, Field<? extends Number> pAufart, Field<String> pFallbackArttextart) {
    Arttextjn f = new Arttextjn();
    f.setPArtId(pArtId);
    f.setPArttextart(pArttextart);
    f.setPSprache(pSprache);
    f.setPAufart(pAufart);
    f.setPFallbackArttextart(pFallbackArttextart);
    return f.asField();
}

如果我想在查询中使用它,我必须将 null 传递给函数:

dsl.select(KAMPARTIKEL.ARTNR, KAMPARTIKEL.ARTNRKAMP,
           PaBez.arttextjn(KAMPARTIKEL.ART_ID, null, null, null, null))

但是 Oracle 不使用默认值。

有没有办法告诉 jOOQ 生成具有所有可能组合的重载方法?否则我无法在 select 子句中使用该函数。

【问题讨论】:

    标签: java sql jooq


    【解决方案1】:

    有没有办法告诉 jOOQ 生成具有所有可能组合的重载方法?

    不,会有太多的组合。当然,您可以自己扩展代码生成器,但我建议不要这样做。

    否则我无法在 select 子句中使用该函数。

    是的,您可以使用它!但不使用那个辅助方法PaBez.arttextjn。可以将其作为独立的函数调用来调用:

    Arttextjn f = new Arttextjn();
    f.setPArtId(1);
    f.execute();
    String result = f.getReturnValue();
    

    应该也可以在 SQL 语句中使用:

    Arttextjn f = new Arttextjn();
    f.setPArtId(KAMPARTIKEL.ART_ID);
    
    var result =
    dsl.select(KAMPARTIKEL.ARTNR, KAMPARTIKEL.ARTNRKAMP, f.asField())
       .from(KAMPARTIKEL)
       .fetch();
    

    在你的情况下,这应该是开箱即用的。

    请注意,从 jOOQ 3.11 开始,在 Oracle 中,jOOQ 在这种情况下按索引而不是按名称传递函数参数(就像 PostgreSQL 那样)。生成的 SQL 是:

    select KAMPARTIKEL.ARTNR, KAMPARTIKEL.ARTNRKAMP, pa_bez.arttextjn(KAMPARTIKEL.ART_ID)
    from KAMPARTIKEL
    

    这很有效,因为您只使用第一个参数,其余参数应用默认值。如果你传递最后一个参数,它就行不通了,在这种情况下,生成的 SQL 必须使用命名参数:

    select 
      KAMPARTIKEL.ARTNR, 
      KAMPARTIKEL.ARTNRKAMP, 
      pa_bez.arttextjn(p_art_id => KAMPARTIKEL.ART_ID)
    from KAMPARTIKEL
    

    我为 jOOQ 3.12 创建了一个问题来解决此问题: https://github.com/jOOQ/jOOQ/issues/8560

    【讨论】:

    • 谢谢,这已经解决了我们的问题,因为我们通常使用第一个参数,但从 3.12 开始的版本会更好!
    • 一般情况下,当重载带有可选参数的方法时,可以在其位置声明多个方法,每个方法都有最右边的可选参数。对于 n 个参数,其中除了第一个参数之外的所有参数都是可选的,第一个方法有一个可选参数(最右边),下一个方法有两个可选参数(最右边的两个),依此类推,对于总共 n - 1 个重载方法。这减少了重载方法组合的数量。
    • @DavidRTribble:感谢您的启发。我认为按照您的建议在 jOOQ API 中生成重载方法没有意义。通常,在 PL/SQL 中,命名和默认参数的使用方式通常与您在 Java 中使用映射或属性的方式相似。根据我的经验,认为最正确的参数更有可能被排除在外的假设是错误的。当然是 YMMV。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 2015-03-15
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多