[ http://issues.apache.org/jira/browse/IBATIS-153?page=all ]

Clinton Begin updated IBATIS-153:
---------------------------------

    Description: 
the invocation of an oracle stored procedura with REF CURSOR as output 
parameter raises a NullPointerException.
The procedure's signature is :
  PROCEDURE test (
      out_cur          OUT      my_cur,
      out_err_code     OUT      NUMBER,
      out_err_text     OUT      VARCHAR2
   )
where  TYPE my_cur IS REF CURSOR;

and ibatis configuration is :
   
    <parameterMap id="params" class="map">
        
        
        
    </parameterMap>


    <resultMap id="result" class="it.app.test.Stock">
        <result property="idInstrument" column="id_instrument"/>
        <result property="shortName" column="shortname"/>
        <result property="refPrice" column="refprice"/>        
    </resultMap>

    <procedure id="getOptions" resultMap="result" parameterMap="params">
       { call OPT_USER.TEST.TEST_CURSOR(?,?,?) }
    </procedure>

the exception stack trace is:
Caused by: 
java.lang.NullPointerException
        at 
com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults(SqlExecutor.java:352)
        at 
com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(SqlExecutor.java:291)
        at 
com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(ProcedureStatement.java:34)
        at 
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
        at 
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList(GeneralStatement.java:123)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:610)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:584)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:105)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForList(SqlMapClientImpl.java:78)
        at it.imiweb.app.data.DataModelTest.testOptions(DataModelTest.java:295)
        at it.imiweb.app.data.DataModelTest.main(DataModelTest.java:445)

Looking  inside the code it seems that the problem is due to the invocation of 
the follow instruction:  
rs = cs.getResultSet()  
in method executeQueryProcedure of SQLExcecutor class that returns a null value 
instead of the resultset as the stored procedure output. To successfully invoke 
the procedure i have modified the code as follow:

  public void executeQueryProcedure(RequestScope request, Connection conn, 
String sql, Object[] parameters,
                                    int skipResults, int maxResults, 
RowHandlerCallback callback)
      ...
      ...
      cs.execute();
      
      //this method returns always null
      //rs = cs.getResultSet(); 
     
      //with this code is possible to get the resultset even if the procedure 
returns more than one output parameter            
      retrieveOutputParameters(cs, mappings, parameters);
      for ( int ii = 0;  ii < parameters.length; ii++ ) {
       if ( parameters[ii] instanceof ResultSet ) {
        rs = ( ResultSet ) parameters[ii];
                    break;
       }
      }
      //end added code
      
      errorContext.setMoreInfo("Check the results (failed to retrieve 
results).");
      handleResults(request, rs, skipResults, maxResults, callback);

      errorContext.setMoreInfo("Check the output parameters (retrieval of 
output parameters failed).");
     //commented because it's already invoked and another call will throw an 
exception 
     //retrieveOutputParameters(cs, mappings, parameters); 
     ...
     ...        
}

The driver jdbc is :
Manifest-Version: 1.0
Specification-Title: "Oracle JDBC driver classes for use with JDK1.4"
Specification-Version: "Oracle JDBC Driver version - 9.0.2.0.0"
Specification-Vendor: "Oracle Corporation" .
Implementation-Title: "ojdbc14.jar"
Implementation-Version: "Oracle JDBC Driver version - 9.0.2.0.0"
Implementation-Vendor: "Oracle Corporation"
Implementation-Time: "Tue Apr  6 01:10:57 2004"

Can you help me, please ?


  was:
the invocation of an oracle stored procedura with REF CURSOR as output 
parameter raises a NullPointerException.
The procedure's signature is :
  PROCEDURE test (
      out_cur          OUT      my_cur,
      out_err_code     OUT      NUMBER,
      out_err_text     OUT      VARCHAR2
   )
where  TYPE my_cur IS REF CURSOR;

and ibatis configuration is :
   
    <parameterMap id="params" class="map">
        <parameter property="Out_Cur" jdbcType="ORACLECURSOR" mode="OUT"/>
        <parameter property="out_err_code" jdbcType="INTEGER" mode="OUT"/>
        <parameter property="out_err_text" jdbcType="VARCHAR" mode="OUT"/>
    </parameterMap>


    <resultMap id="result" class="it.app.test.Stock">
        <result property="idInstrument" column="id_instrument"/>
        <result property="shortName" column="shortname"/>
        <result property="refPrice" column="refprice"/>        
    </resultMap>

    <procedure id="getOptions" resultMap="result" parameterMap="params">
       { call OPT_USER.TEST.TEST_CURSOR(?,?,?) }
    </procedure>

the exception stack trace is:
Caused by: 
java.lang.NullPointerException
        at 
com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults(SqlExecutor.java:352)
        at 
com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(SqlExecutor.java:291)
        at 
com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(ProcedureStatement.java:34)
        at 
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
        at 
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList(GeneralStatement.java:123)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:610)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:584)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:105)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForList(SqlMapClientImpl.java:78)
        at it.imiweb.app.data.DataModelTest.testOptions(DataModelTest.java:295)
        at it.imiweb.app.data.DataModelTest.main(DataModelTest.java:445)

Looking  inside the code it seems that the problem is due to the invocation of 
the follow instruction:  
rs = cs.getResultSet()  
in method executeQueryProcedure of SQLExcecutor class that returns a null value 
instead of the resultset as the stored procedure output. To successfully invoke 
the procedure i have modified the code as follow:

  public void executeQueryProcedure(RequestScope request, Connection conn, 
String sql, Object[] parameters,
                                    int skipResults, int maxResults, 
RowHandlerCallback callback)
      ...
      ...
      cs.execute();
      
      //this method returns always null
      //rs = cs.getResultSet(); 
     
      //with this code is possible to get the resultset even if the procedure 
returns more than one output parameter            
      retrieveOutputParameters(cs, mappings, parameters);
      for ( int ii = 0;  ii < parameters.length; ii++ ) {
       if ( parameters[ii] instanceof ResultSet ) {
        rs = ( ResultSet ) parameters[ii];
                    break;
       }
      }
      //end added code
      
      errorContext.setMoreInfo("Check the results (failed to retrieve 
results).");
      handleResults(request, rs, skipResults, maxResults, callback);

      errorContext.setMoreInfo("Check the output parameters (retrieval of 
output parameters failed).");
     //commented because it's already invoked and another call will throw an 
exception 
     //retrieveOutputParameters(cs, mappings, parameters); 
     ...
     ...        
}

The driver jdbc is :
Manifest-Version: 1.0
Specification-Title: "Oracle JDBC driver classes for use with JDK1.4"
Specification-Version: "Oracle JDBC Driver version - 9.0.2.0.0"
Specification-Vendor: "Oracle Corporation" .
Implementation-Title: "ojdbc14.jar"
Implementation-Version: "Oracle JDBC Driver version - 9.0.2.0.0"
Implementation-Vendor: "Oracle Corporation"
Implementation-Time: "Tue Apr  6 01:10:57 2004"

Can you help me, please ?


       Priority: Minor  (was: Major)

> NullPointer exception during call of  oracle stored procedure with REF CURSOR 
> as output parameter
> -------------------------------------------------------------------------------------------------
>
>          Key: IBATIS-153
>          URL: http://issues.apache.org/jira/browse/IBATIS-153
>      Project: iBatis for Java
>         Type: Bug
>   Components: SQL Maps
>     Versions: 2.1.0
>  Environment: Oracle 9.
>     Reporter: ppz4j
>     Priority: Minor
>      Fix For: 2.1.5

>
> the invocation of an oracle stored procedura with REF CURSOR as output 
> parameter raises a NullPointerException.
> The procedure's signature is :
>   PROCEDURE test (
>       out_cur          OUT      my_cur,
>       out_err_code     OUT      NUMBER,
>       out_err_text     OUT      VARCHAR2
>    )
> where  TYPE my_cur IS REF CURSOR;
> and ibatis configuration is :
>    
>     <parameterMap id="params" class="map">
>         
>         
>         
>     </parameterMap>
>     <resultMap id="result" class="it.app.test.Stock">
>         <result property="idInstrument" column="id_instrument"/>
>         <result property="shortName" column="shortname"/>
>         <result property="refPrice" column="refprice"/>        
>     </resultMap>
>     <procedure id="getOptions" resultMap="result" parameterMap="params">
>        { call OPT_USER.TEST.TEST_CURSOR(?,?,?) }
>     </procedure>
> the exception stack trace is:
> Caused by: 
> java.lang.NullPointerException
>       at 
> com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults(SqlExecutor.java:352)
>       at 
> com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(SqlExecutor.java:291)
>       at 
> com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(ProcedureStatement.java:34)
>       at 
> com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
>       at 
> com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList(GeneralStatement.java:123)
>       at 
> com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:610)
>       at 
> com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:584)
>       at 
> com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:105)
>       at 
> com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForList(SqlMapClientImpl.java:78)
>       at it.imiweb.app.data.DataModelTest.testOptions(DataModelTest.java:295)
>       at it.imiweb.app.data.DataModelTest.main(DataModelTest.java:445)
> Looking  inside the code it seems that the problem is due to the invocation 
> of the follow instruction:  
> rs = cs.getResultSet()  
> in method executeQueryProcedure of SQLExcecutor class that returns a null 
> value instead of the resultset as the stored procedure output. To 
> successfully invoke the procedure i have modified the code as follow:
>   public void executeQueryProcedure(RequestScope request, Connection conn, 
> String sql, Object[] parameters,
>                                     int skipResults, int maxResults, 
> RowHandlerCallback callback)
>       ...
>       ...
>       cs.execute();
>       
>       //this method returns always null
>       //rs = cs.getResultSet(); 
>      
>       //with this code is possible to get the resultset even if the procedure 
> returns more than one output parameter          
>       retrieveOutputParameters(cs, mappings, parameters);
>       for ( int ii = 0;  ii < parameters.length; ii++ ) {
>        if ( parameters[ii] instanceof ResultSet ) {
>               rs = ( ResultSet ) parameters[ii];
>                     break;
>        }
>       }
>       //end added code
>       
>       errorContext.setMoreInfo("Check the results (failed to retrieve 
> results).");
>       handleResults(request, rs, skipResults, maxResults, callback);
>       errorContext.setMoreInfo("Check the output parameters (retrieval of 
> output parameters failed).");
>      //commented because it's already invoked and another call will throw an 
> exception 
>      //retrieveOutputParameters(cs, mappings, parameters); 
>      ...
>      ...      
> }
> The driver jdbc is :
> Manifest-Version: 1.0
> Specification-Title: "Oracle JDBC driver classes for use with JDK1.4"
> Specification-Version: "Oracle JDBC Driver version - 9.0.2.0.0"
> Specification-Vendor: "Oracle Corporation" .
> Implementation-Title: "ojdbc14.jar"
> Implementation-Version: "Oracle JDBC Driver version - 9.0.2.0.0"
> Implementation-Vendor: "Oracle Corporation"
> Implementation-Time: "Tue Apr  6 01:10:57 2004"
> Can you help me, please ?

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to