我正在使用MyBatis在Java中工作,以在SQL Server中调用存储过程。此存储过程采用一个参数。在我的代码中,在调用sproc之前,我检查了这些参数是否不为null,并记录了其值。
在我的测试环境中,此方法工作正常且符合预期。不过,当我尝试生产时,我注意到日志正在显示
1 - [INFO] Calling PR_ProcedureName with ParameOneName=validNonNullValue
2 - [ERROR] Error updating database. Cause: java.sql.SQLException: Procedure or function 'PR_ProcedureName' expects parameter '@@ParamOneName', which was not supplied.
3 - [ERROR] Error updating database. Cause: java.sql.SQLException: Procedure or function 'PR_ProcedureName' expects parameter '@@ParamOneName', which was not supplied.
当我查看数据库时,可以看到sproc更新了适当的值。因此,它似乎成功运行了一次,然后又在没有提供任何参数的情况下再次触发了两次。
我怀疑随后对proc的错误调用不是由我编写的任何代码触发的,而是由MyBatis映射器触发的。由于应用程序正在获取异常,因此它也不会在数据库级别被触发。
编写我的应用程序的方式,在没有传递有效参数的情况下永远不会调用sproc。
Java中的相关映射器方法:
void callProcedure(@Param("ParamOne") UUID paramOne)
以及相应的XML:
<update id="callProcedure" statementType="CALLABLE" parameterType="Uuid">
{
CALL dbo.PR_ProcedureName (
@ParamOne = #{paramOne},
)
}
</update>