Return 使用 Mybatis 的 Oracle 函数的值

Return value from Oracle function using Mybatis

我查看了有关此问题的许多 Whosebug 问题,但找不到任何有意义的问题。 最接近,但没有显示如何从函数中获取 return 值。

这是我的映射器调用:

public Long callMyFunction(@Param("recordId") Long recordId, @Param("otherId") Long otherId, @Param("date") Date date, @Param("comments") String comments);

这是映射器 XML:

<select id="callMyFunction" parameterType="map" statementType="CALLABLE"  resultType="java.lang.Long">
    {  #{resultId,javaType=java.lang.Long,jdbcType=NUMERIC,mode=OUT} = call MYSCHEMA.MYPACKAGE.my_function(
    #{recordId,jdbcType=NUMERIC,mode=IN},
    #{otherId,jdbcType=NUMERIC,mode=IN},
    #{date,jdbcType=DATE,mode=IN},
    #{comments,jdbcType=VARCHAR,mode=IN})}
</select>

调用有效,但 return 值 (resultId) 始终为空。

有人能发现问题吗?

如果你想return直接得到结果,那么SQL调用必须是: SELECT MYSCHEMA.MYPACKAGE.my_function(...) FROM DUAL

如果您想继续以过程调用方式调用函数,这意味着结果是一个 OUT 参数(您将其声明为 OUT)。 最小的变化包括向映射器方法签名添加一个参数: public Long callMyFunction(@Param("recordId") Long recordId, @Param("otherId") Long otherId, @Param("date") Date date, @Param("comments") String comments, @Param("resultIdContainer") Map<String, Long> resultIdContainer);

在 XML 中:忘记 resultType,这是针对 select 的。和电话: { #{resultIdContainer.resultId, javaType=java.lang.Long,jdbcType=NUMERIC,mode=OUT} = call ...

并不是说我在这里使用映射来包含 resutlId:需要间接访问:该函数会将参数 'result' 值写入您稍后可以阅读的地方(在您的映射器调用之后),您也可以使用class 与 resultId 属性.