oops, i meant execute instead of executeQuery.

Brandon


On Tue, 22 Mar 2005 18:53:09 -0700, Brandon Goodin
<[EMAIL PROTECTED]> wrote:
> The unofficial line on this is that we will make it possible to run
> execute instead of execute Update.
> 
> Brandon
> 
> 
> On Tue, 22 Mar 2005 19:46:04 -0600, Ken Katsma <[EMAIL PROTECTED]> wrote:
> > Brandon,
> >
> > I haven't heard back from you on this.  Do you think this functionality
> > might be integrated in a near future release?  I've got a meeting with
> > 23 development managers and enterprise architects tomorrow and they'll
> > probably be asking me about this feature in iBatis.  I was hoping to be
> > able to tell them it'll be in the main dev stream soon.  Do you see any
> > roadblocks to its eventual integration?
> >
> > Thanks,
> >
> > Ken
> >
> > Brandon Goodin (JIRA) wrote:
> >
> > >     [ 
> > > http://issues.apache.org/jira/browse/IBATIS-53?page=comments#action_60696 
> > > ]
> > >
> > >Brandon Goodin commented on IBATIS-53:
> > >--------------------------------------
> > >
> > >Let me see if i understand this correctly...
> > >
> > >A cursor must be retrieved using a CallableStatement/Stored Procedure. The 
> > >Callable Statement returns a ResultSet as an OUT parameter that you want 
> > >to map to objects as normal with ibatis. Your current issue is that you 
> > >need to cs.execute instead of cs.executeQuery because you do no expect a 
> > >resultset directly back.
> > >
> > >Is that correct?
> > >
> > >
> > >
> > >>Support for oracle cursors as resultsets
> > >>----------------------------------------
> > >>
> > >>         Key: IBATIS-53
> > >>         URL: http://issues.apache.org/jira/browse/IBATIS-53
> > >>     Project: iBatis for Java
> > >>        Type: New Feature
> > >>  Components: SQL Maps
> > >>    Reporter: Ken Katsma
> > >>    Priority: Minor
> > >>
> > >>
> > >
> > >
> > >
> > >>iBatis doesn't currently support result sets from functions in Oracle.  A 
> > >>modification to SQLExecutor as detailed below can add the necessary 
> > >>support.  However, it requires a hard-coded check for an Oracle driver.  
> > >>A better option would be to supply a factory for alternate SQLExecutor's 
> > >>for different dialects.  This would allow for any future database 
> > >>specific customization as well.
> > >>The code change is in SQLExecutor.executeQueryProcedure (see comments):
> > >> public void executeQueryProcedure(RequestScope request, Connection conn, 
> > >> String sql, Object[] parameters,
> > >>                                   int skipResults, int maxResults, 
> > >> RowHandlerCallback callback)
> > >>     throws SQLException {
> > >>   ErrorContext errorContext = request.getErrorContext();
> > >>   errorContext.setActivity("executing query procedure");
> > >>   errorContext.setObjectId(sql);
> > >>   CallableStatement cs = null;
> > >>   ResultSet rs = null;
> > >>     try {
> > >>     errorContext.setMoreInfo("Check the SQL Statement (preparation 
> > >> failed).");
> > >>     cs = conn.prepareCall(sql);
> > >>     ParameterMap parameterMap = request.getParameterMap();
> > >>     ParameterMapping[] mappings = parameterMap.getParameterMappings();
> > >>     errorContext.setMoreInfo("Check the output parameters (register 
> > >> output parameters failed).");
> > >>     registerOutputParameters(cs, mappings);
> > >>     errorContext.setMoreInfo("Check the parameters (set parameters 
> > >> failed).");
> > >>     parameterMap.setParameters(request, cs, parameters);
> > >>     errorContext.setMoreInfo("Check the statement (update procedure 
> > >> failed).");
> > >>     // ****************************************
> > >>     // Code changes below
> > >>     // ****************************************
> > >>         if 
> > >> (conn.getMetaData().getDatabaseProductName().equalsIgnoreCase("Oracle"))
> > >>     {
> > >>      // If in oracle then execute instead of executeQuery
> > >>         boolean b = cs.execute();
> > >>                 errorContext.setMoreInfo("In Oracle query mode.");
> > >>         errorContext.setMoreInfo("Check the output parameters (retrieval 
> > >> of output parameters failed).");
> > >>      // Get the output parameters first, instead of last
> > >>         retrieveOutputParameters(cs, mappings, parameters);
> > >>      // Then find the resultset and handle it
> > >>            for (int i=0;i<parameters.length;i++)
> > >>         {
> > >>             if (parameters[i] instanceof ResultSet)
> > >>             {
> > >>                 rs = (ResultSet) parameters[i];
> > >>                 break;
> > >>             }
> > >>         }
> > >>         errorContext.setMoreInfo("Check the results (failed to retrieve 
> > >> results).");
> > >>         handleResults(request, rs, skipResults, maxResults, callback);
> > >>     }
> > >>     //****************************************
> > >>     // Non-oracle..original code
> > >>     else
> > >>     {
> > >>
> > >>         errorContext.setMoreInfo("In non-Oracle mode.");
> > >>         rs = cs.executeQuery();
> > >>       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).");
> > >>       retrieveOutputParameters(cs, mappings, parameters);
> > >>     }
> > >>     } finally {
> > >>     try {
> > >>       closeResultSet(rs);
> > >>     } finally {
> > >>       closeStatement(cs);
> > >>     }
> > >>   }
> > >>An example mapping looks like:
> > >> <parameterMap id="clientParameters" class="map" >
> > >>       <parameter property="result" jdbcType="ORACLECURSOR" mode="OUT"/>
> > >>       <parameter property="maxRows" jdbcType="VARCHAR" 
> > >> javaType="java.lang.String" mode="IN"/>
> > >>   </parameterMap>
> > >>   <procedure id="getClientListProc" resultMap="clientResult" 
> > >> parameterMap="clientParameters">
> > >>       {?= call abc.CLIENT_VIEW_PKG.client_result_list_f(?)}
> > >>   </procedure>
> > >>
> > >>
> > >
> > >
> > >
> >
> >
>

Reply via email to