Raijin_x-u
Raijin_x-u

Reputation: 103

java.sql.SQLException: ORA-01008: not all variables bound using Mybatis 3

So I'm using Mybatis 3 to make procedure calls. This is the first time I'm using this method to make calls to an oracle database (the other times it was a mysql database) and i get the above mentioned error. I have never had an issue making mysql database calls in the same fashion is there something special i need to do with oracle? It seems that this error message generally means that the number of parameters or '?' don't match the what's being set, but as can be seen from my xml file I am setting all the parameters.

10:07:22,079 [DEBUG] {call.authenticateCmplnr} - ooo Using Connection [oracle.jdbc.driver.OracleConnection@543d1aa8]
10:07:22,083 [DEBUG] {call.authenticateCmplnr} - ==>  Preparing: CALL TDU_LOGIN_USER_CHECK( ?, ?, ?, ?, ? ) 
10:07:22,129 [DEBUG] {call.authenticateCmplnr} - ==> Parameters: m440109(String), TDU(String)
org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.sql.SQLException: ORA-01008: not all variables bound

### The error may exist in com/cmplnr/datasource/dataservice.xml
### The error may involve call.authenticateCmplnr-Inline
### The error occurred while setting parameters
### SQL: CALL TDU_LOGIN_USER_CHECK(    ?,    ?,    ?,    ?,    ?   )
### Cause: java.sql.SQLException: ORA-01008: not all variables bound

    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:107)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:98)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:62)
    at com.cmplnr.integration.AuthenticationServiceImpl.authorizeAccess(AuthenticationServiceImpl.java:80)
    at com.cmplnr.integration.AuthenticationServiceImpl.authenticateCmplnr(AuthenticationServiceImpl.java:53)
    at com.cmplnr.control.TDU_Control.test(TDU_Control.java:24)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:174)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:421)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:409)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1813)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.SQLException: ORA-01008: not all variables bound

    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
    at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
    at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:590)
    at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1973)
    at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1119)
    at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2191)
    at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:2064)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2989)
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:658)
    at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:736)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:55)
    at $Proxy14.execute(Unknown Source)
    at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:56)
    at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:70)
    at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:57)
    at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:259)
    at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:132)
    at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:105)
    at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:81)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:104)
    ... 34 more

My implementation

private User authorizeAccess(String id){
        SqlSession session = sqlSessionFactory.openSession();

        Map<String,Object>params = new HashMap<String,Object>();
        params.put("id", id);
        params.put("cycleType", "TDU");

        User user = null;

        try{
            user = session.selectOne("call.authenticateCmplnr", params);
        }catch(Exception e){
            e.printStackTrace();
            return null;
        }finally{
            session.close();
        }

        return user;

    }

The xml file

<mapper namespace="call">

    <resultMap id = "userMap" type="com.cmplnr.core.User">
        <result property="id" column="ATTRIBUTE1"/>
        <result property="fullName" column="USER_NAME"/>
    </resultMap>

    <select id = "authenticateCmplnr" parameterType="java.util.Map">
        CALL TDU_LOGIN_USER_CHECK(
            #{id, mode=IN, jdbcType=VARCHAR},
            #{cycleType, mode=IN, jdbcType=VARCHAR},
            #{cursor, mode=OUT, jdbcType=CURSOR, resultMap=userMap},
            #{errcode, mode=OUT, jdbcType=INTEGER},
            #{errmsg, mode=OUT, jdbcType=VARCHAR}
        )
    </select>

</mapper>

Upvotes: 0

Views: 3698

Answers (1)

Yigitalp Ertem
Yigitalp Ertem

Reputation: 2039

Can you try putting your OUT parameters to the Map, with null values? You can see this possibly dupe answer.

private User authorizeAccess(String id){
    SqlSession session = sqlSessionFactory.openSession();

    Map<String,Object>params = new HashMap<String,Object>();
    params.put("id", id);
    params.put("cycleType", "TDU");
    params.put("cursor", null);
    params.put("errcode", null);
    params.put("errmsg", null);

    User user = null;

    try{
        user = session.selectOne("call.authenticateCmplnr", params);
    }catch(Exception e){
        e.printStackTrace();
        return null;
    }finally{
        session.close();
    }

    return user;

}

Upvotes: 0

Related Questions