java - 如何使用 MyBatis 调用返回 BOOLEAN 的函数?

标签 java oracle plsql mybatis plsqldeveloper

我正在使用 MyBatis 调用 PL SQL 数据库中的函数。该函数的 OUT 参数之一为 BOOLEAN,如下所示:

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

我的问题是,当我尝试从 xml 映射器调用该函数时,每次尝试 mybatis 都无法识别 boolean 输出并抛出类似不兼容类型的错误。另外,当我尝试测试 PLSQL Developer 中的函数时,它会进行如下转换 :pout_boolean_result := sys.diutil.bool_to_int(pout_boolean_result); 并将 boolean 值返回给我。

是否可以忽略该整数并指定 MyBatis 将输出视为 boolean 值?我怎样才能做到这一点?

我的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>

最佳答案

为了测试它,我定义了该函数,如下所示。

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 指出的那样。

映射器方法定义为...

void getFooFunction(FooFuncParam param);

参数是一个POJO。

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

这是映射器声明。

<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 进行了测试。

关于java - 如何使用 MyBatis 调用返回 BOOLEAN 的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58205549/

相关文章:

java - 无法重命名表

sql - 在存储过程中声明 SYS_REFCURSOR 和 ROWTYPE

sql - 在 Oracle 中从序列中获取增量

oracle - 我是 PL/SQL 的新手。有人可以帮助我了解这个 PL/SQL 过程吗?

oracle - Oracle 包中的 SELECT ... FOR UPDATE

java - 使用单击 Spinner Item 刷新 ArrayList 以将新数据显示到 RecyclerView 中

java - 为后台线程从 Hibernate 获取新 session

java - 查明文本是否太长而无法显示并且需要换行

sql - 您如何解释查询的解释计划?

c# - 向客户端显示来自 PL/SQL 过程的错误消息