我已经看过很多关于这个问题的StackOverflow问题,但找不到任何有意义的问题。 This one最接近,但没有显示如何从函数中获取返回值。
这是我的映射器调用:
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>
调用有效,但返回值(resultId)始终为null。
有人能发现问题吗?
答案 0 :(得分:2)
如果要直接返回结果,则SQL调用必须是:
try:
f = foo()
a = f if f is not None else b
except AttributeError:
a = b
如果你想继续在过程调用样式中调用函数,这意味着结果是OUT 参数(你env声明它是OUT)。
最小的更改包括向mapper方法签名添加一个参数:
SELECT MYSCHEMA.MYPACKAGE.my_function(...) FROM DUAL
在XML中:忘记 resultType ,这是 select 的。电话:
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);
不是我在这里使用地图来包含resutlId:需要间接:函数会将参数'result'值写入稍后你可以读取的地方(在你的mapper调用之后),你也可以使用一个类resultId属性。