Oracle函数中的默认值

时间:2019-04-23 11:30:58

标签: java sql jooq

假定以下函数声明:

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 个答案:

答案 0 :(得分: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