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