【问题标题】:Mybatis Oracle Stored ProcedureMybatis Oracle 存储过程
【发布时间】:2014-05-26 17:43:10
【问题描述】:

我在调用 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存储过程的简单示例,用于多个输入输出参数?

【问题讨论】:

    标签: oracle output mybatis procedure


    【解决方案1】:

    Jeff Butler 在mybatis-user group 中说:

    对于存储过程参数,MyBatis 会同时映射输入和 将参数输出到 parameterType 中的属性。

    您可以尝试发送 Map、POJO 或三个带有 userId、userPwd 和 userType 的注释变量。 SP被调用后,MyBatis会将OUT参数设置为userType。

    我现在无法尝试,稍后我会尝试编辑答案。但是你能试试这些吗,

    1) 如下定义你的函数,并在调用 SP 后检查 userType 是否更新。

    void getUserType(Param("userId") String userId, Param("userPwd") String userPwd, Param("userType") String userType);
    

    或

    2) 创建一个Map,添加3个key-value对,即("userId", 1234), ("userPwd", 666), ("userType, null) tuples。调用SP后可以尝试获取 userType 值。

    void getUserType(Map<String, Object> myMap);
    

    或

    3) 创建一个包含 3 个变量(userId、userPwd、userType)、getter、setter 的类。设置 userId 和 userPwd 值。打电话给 SP。然后,userObj.getUserType()。

    void getUserType(UserClass userObj);
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 2011-01-03
    • 2011-12-29
    相关资源
    最近更新 更多