Hi! I tried putting the fix between Procedure proc = context.getEntityResolver().getProcedure("cayenne_tst_select_proc"); and ProcedureQuery query = new ProcedureQuery(proc);
This way I don't need any special context setup. It appears to work. I just copied over the content of OracleStackAdapter.tweakProcedure(). Is there anything special I should look out for? Regards, David > -----Original Message----- > From: Andrus Adamchik [mailto:and...@objectstyle.org] > Sent: Tuesday, January 18, 2011 9:33 PM > To: user@cayenne.apache.org > Subject: Re: Stored procedures - more examples? > Importance: Low > > > On Jan 18, 2011, at 8:28 PM, David Balažic wrote: > > > So, does that testcase really work on Oracle? > > Yes. Now revisiting the tests, we are cheating to make the > generic mapping work with Oracle. The reason for this is > Oracle driver's insistence on circumventing basic JDBC > abstractions. We take a generic mapping [1] and alter the > procedure object in the test code [2]. Notice how we install > Oracle-specific type as an OUT parameter type: > > // the type used below is "oracle.jdbc.OracleTypes.CURSOR" > proc.addCallParameter(new ProcedureParameter("result", > OracleAdapter.getOracleCursorType(), > ProcedureParameter.OUT_PARAMETER)); > > For now the above (creating or tweaking procedure mapping > metadata in the code) is one possible way for dealing with > Oracle. Going forward, we may either support numeric values > for column types (so that a user could map this column as > "-10", same as "oracle.jdbc.driver.OracleTypes.CURSOR"). Or > maybe we should dynamically rewrite Cayenne-mapped stored > procedures, adding CURSOR parameter inside Cayenne (not yet > sure how what part of the mapping should trigger such behavior).\ > > And unfortunately there's little hope that after all these > years Oracle will finally fix their driver (or at least > implement ParameterMetaData JDBC interface so that > Oracle-specific types could be used dynamically). > > Andrus > > > [1] > > <procedure name="cayenne_tst_select_proc"> > <procedure-parameter name="aName" type="VARCHAR" > length="254" direction="in"/> > <procedure-parameter name="paintingPrice" type="INTEGER" > direction="in"/> > </procedure> > > > [2] OracleStackAdapter.java: > > public void tweakProcedure(Procedure proc) { > if > (DataContextProcedureQueryTest.SELECT_STORED_PROCEDURE.equals( > proc.getName()) > && proc.getCallParameters().size() == 2) { > List params = new ArrayList(proc.getCallParameters()); > > proc.clearCallParameters(); > proc.addCallParameter(new > ProcedureParameter("result", OracleAdapter > .getOracleCursorType(), > ProcedureParameter.OUT_PARAMETER)); > Iterator it = params.iterator(); > while (it.hasNext()) { > ProcedureParameter param = > (ProcedureParameter) it.next(); > proc.addCallParameter(param); > } > > proc.setReturningValue(true); > } > } >