#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. О, я не заметил логического значения. Спасибо.