Как я могу вызвать функцию, которая возвращает BOOLEAN, используя MyBatis? - PullRequest
0 голосов
/ 02 октября 2019

Я использую MyBatis для вызова функции в базе данных PL SQL. Функция имеет один из параметров OUT как BOOLEAN, например:

FUNCTION f_foo_function(foo IN VARCHAR, foo_output OUT BOOLEAN, error OUT VARCHAR2)

Моя проблема заключается в том, что когда я пытаюсь вызвать функцию из моего модуля отображения XML, при каждой попытке mybatis не распознается логический вывод икинь мне и ошибку как несовместимые типы. Также, когда я пытаюсь протестировать функцию из PLSQL Developer, она делает преобразование, подобное этому :pout_boolean_result := sys.diutil.bool_to_int(pout_boolean_result);, и возвращает мне логическое значение в виде бита.

Можно игнорировать это целое число и указать MyBatis для обработкивыход как логическое значение? Как я могу это сделать?

Мой xml выглядит примерно так:

<select id="getFooFunction" statementType="CALLABLE">
        {#{result, mode=OUT, jdbcType=INTEGER} = call f_foo_function
        (
            #{foo, mode=IN, jdbcType=VARCHAR},
            #{foo_output, mode=OUT, jdbcType=DOUBLE},
            #{error, mode=OUT, jdbcType=VARCHAR}
        )
        }
</select>

1 Ответ

1 голос
/ 03 октября 2019

Чтобы проверить это, я определил функцию следующим образом.

create or replace function f_foo_function(
  foo in varchar, 
  foo_output out integer, 
  error out varchar2
) return integer is
begin
    foo_output := 1;
    error := 'No error';
  return 99;
end;

foo_output определяется как INTEGER, поскольку BOOLEAN недопустимо, как указано APC.

Метод mapper определен как ...

void getFooFunction(FooFuncParam param);

Параметр является POJO.

public class FooFuncParam {
  private Integer result;
  private String foo;
  private boolean fooOutput;
  private String error;
  // getters/setters
}

А вот оператор mapper.

<update id="getFooFunction" statementType="CALLABLE">
  {#{result,jdbcType=INTEGER,mode=OUT} = call f_foo_function(
    #{foo,mode=IN},
    #{fooOutput,jdbcType=INTEGER,javaType=_boolean,mode=OUT}, 
    #{error,jdbcType=VARCHAR,mode=OUT})}
</update>

Обратите внимание, чтоjavaType указано для преобразования INTEGER в boolean.
Если функция устанавливает 0 в foo_output, false устанавливается в FooFuncParam.fooOutput. И ненулевое значение означает true. При необходимости вы можете написать собственный обработчик типа для изменения поведения.

Вот исполняемый файл demo , протестированный с Oracle 18c и ojdbc 19.3.0.0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...