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> > >> > >> > > > > > > > >
