我在调用oracle存储过程并从Oracle存储过程中获取输出参数时遇到问题。 这是我的映射器 AppUserMapper.java
public interface AppUserMapper {
@Select(value= "{ CALL sp_check_user( #{userId, mode=IN, jdbcType=VARCHAR }, #{userPwd, mode=IN, jdbcType=VARCHAR}, #{userType, jdbcType=VARCHAR, mode=OUT} )}")
@Options(statementType = StatementType.CALLABLE)
Object getUserType(String userId,String UserPwd);
}
Dao call
Map<String, Object> retrurnStatus = (Map<String, Object>) appUserMapper.getUserType(userId,UserPwd);
这是存储过程代码
CREATE OR REPLACE PROCEDURE HR.sp_check_user (userId VARCHAR,userPwd VARCHAR, userType OUT VARCHAR )
AS
BEGIN
BEGIN
select user_type into userType from appuser where USER_ID = userId and USER_PWD = userPwd ;
EXCEPTION
WHEN NO_DATA_FOUND THEN
userType := 'Invalid';
END ;
END ;
/
正在执行存储过程但是给出了错误
DEBUG 2014-04-12 09:51:56,948 org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl: ==> Preparing: { CALL sp_check_user( ?, ?, ? ) }
DEBUG 2014-04-12 09:51:57,103 org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl: ==> Parameters: abc(String), abc1(String)
Could not complete request
java.lang.NullPointerException
at com.appuser.dao.AppUserDaoImpl.getUserType(AppUserDaoImpl.java:33)
我一直在尝试多种选择,但找不到我可以采取的样本并尝试。
我将在此处传递适当的帮助,因为我一直在尝试在mybatis中使用具有多个输入和输出参数的oracle存储过程。
有人可以提供简单的示例,使用mybatis为多个输入输出参数调用Oracle存储过程吗?
答案 0 :(得分:0)
杰夫巴特勒在mybatis-user group中说:
对于存储过程参数,MyBatis将映射输入和 输出参数到parameterType中的属性。
您可以尝试发送包含userId
,userPwd
和userType
的地图,POJO或三个带注释的变量。调用SP后,MyBatis会将OUT参数设置为userType。
我现在无法尝试,我会稍后尝试编辑答案。但你可以尝试这些,
1)按如下方式定义您的功能,并在调用SP后检查userType是否更新。
void getUserType(Param("userId") String userId, Param("userPwd") String userPwd, Param("userType") String userType);
或
2)创建一个Map,添加3个键值对,即(“userId”,1234),(“userPwd”,666),(“userType,null)元组。在调用SP后,你可以尝试获取userType值。
void getUserType(Map<String, Object> myMap);
或
3)创建一个包含3个变量(userId,userPwd,userType),getter,setter的类。设置userId和userPwd值。打电话给SP。然后,userObj.getUserType()。
void getUserType(UserClass userObj);