有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Oracle函数中的java默认值

假设函数声明如下:

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子句中使用该函数


共 (1) 个答案

  1. # 1 楼答案

    Is there a way to tell jOOQ to generate overloaded methods with all possible combinations?

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

    Otherwise I'm not able to use that function in a select clause.

    是的,你可以用它!但不使用辅助方法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