【问题标题】:How can i call a function that return a BOOLEAN using MyBatis?如何使用 MyBatis 调用返回 BOOLEAN 的函数?
【发布时间】:2020-01-31 23:18:28
【问题描述】:

我正在使用 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>

【问题讨论】:

  • 您的数据库是什么版本的 Oracle?我记得,11g 的 JDBC 驱动程序没有布尔类型的概念
  • 请将您遇到的实际错误添加到问题中
  • 带有 OUT 参数的函数是不好的做法,尤其是因为我们不能在 SELECT 语句中使用它们。函数应该只返回(如在关键字 RETURN 中)一个值。此外,Oracle SQL 不支持 BOOLEAN 数据类型。因此 SYS.DIUTIL.BOOL_TO_INT()。恐怕您需要重写您的函数,使其符合 Oracle SQL 规则。

标签: java oracle plsql mybatis plsqldeveloper


【解决方案1】:

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

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,因为 APC 指出 BOOLEAN 无效。

mapper方法定义为...

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。如有必要,您可以编写自定义类型处理程序来更改行为。

这是一个使用 Oracle 18c 和 ojdbc 19.3.0.0 测试的可执行文件 demo

【讨论】:

  • 这个答案对我来说很好,谢谢!但是,如果您无权修改数据库中的函数并且被定义为 BOOLEAN,会发生什么? MyBatis 是否有任何处理程序来映射响应?
  • 很高兴知道它有效。问题是,Oracle 中似乎没有 BOOLEAN 类型。它是用户定义的类型还是什么?无论如何,如果内置的BooleanTypeHandler 不起作用,编写自定义类型处理程序相当容易。在这种情况下,您可能需要在参数引用中指定typeHandler 而不是javaType
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多