jOOQ генерирует статический метод для вызова функции, но нет метода для получения ее как поля

#java #sql #oracle #plsql #jooq

#java #sql #Oracle #plsql #jooq

Вопрос:

Я хочу превратить этот оператор SQL в jOOQ select:

 select art_id,
       artnr,
       pa_bez.arttext(art_id, null, pa_param.text(10, 1)) text,
from artikel;
  

Но я не могу использовать pa_bez.arttext, потому что в сгенерированном пакете PaBez я могу найти только статический метод для вызова функции:

 public static String arttext(Configuration configuration, Number pArtId, 
                             String pArttextart, String pSprache, 
                             Number pAufart, Boolean pFallbackArttextart) {
...
}
  

Но нет способа использовать его как поле, как я получил с другими функциями:

 public static String arttextart(Configuration configuration, String pArttextart, 
                                String pSprache) {
...
}

public static Field<String> arttextart(String pArttextart, String pSprache) {
...
}
  

Это ошибка или неправильное понимание jOOQ на моей стороне?

Это код функции:

 FUNCTION ARTTEXT
(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 boolean default true
)
RETURN VARCHAR2
  

Ответ №1:

Тип BOOLEAN данных является типом данных PL / SQL и не существует в SQL engine. К сожалению, нет прямого способа передать логический аргумент вашей функции в SQL.

Однако при тестировании с Oracle 12 и учитывая, что у вас есть значение по умолчанию в сигнатуре функции, jOOQ может просто опустить параметр. Это должно сработать (но это еще не поддерживается jOOQ 3.11):

 SELECT pa_bez.arttext(1) FROM dual
  

Если вам нужно передать логическую переменную привязки, также будет работать следующий обходной путь:

 WITH
  FUNCTION arttext_(
    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 number default 1
  ) RETURN VARCHAR2 IS BEGIN
    RETURN pa_bez.arttext(
      p_art_id, 
      p_arttextart, 
      p_sprache,
      p_aufart
      CASE p_fallback_arttextart WHEN 1 THEN TRUE WHEN 0 THEN FALSE ELSE NULL END
    );
  END arttext_;
SELECT arttext_(?, ?, ?, ?, ?) FROM dual
  

Я думаю, что jOOQ 3.12 может реализовать вышеуказанный обходной путь для Oracle 12 . Я создал проблему для этого:
https://github.com/jOOQ/jOOQ/issues/8522

Я также писал об этом в блоге более подробно здесь .

В то же время вам, возможно, придется соединить ваш вызов вручную, создав вспомогательную функцию, как я показал, переводя между NUMBER и BOOLEAN

Комментарии:

1. О, я не заметил логического значения. Спасибо.