java - Oracle 函数中的默认值

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

最佳答案

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

关于java - Oracle 函数中的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55810226/

相关文章:

php - 忽略重复记录但将它们置顶

mysql - 按结果获取分组数

json - 将 JSON 存储在 msSQL 数据库中?

json - 使用 JOOQ 将数据插入 postgres 中的 JSON 列

java - 即使在自定义插件中使用显式绑定(bind),m2e 仍然会报错 "Plugin execution not covered by lifecycle configuration"

java - Eclipse 控制台中没有输出,但其余方法有效

java - 从请求 json 在 spring 中创建嵌套实体

java - jOOQ 加入 Select<?> 对象

java - 如何在 JOOQ 中设置一个@Variable

java - ActiveMQ 仅在必要时保留在磁盘上