Hi Greg,

Glad you resolved it, and good to know the cause. I remember Oracle driver quality issues plagued us since the early days of Cayenne, but since I rarely use Oracle myself these days, I've been out of the loop on the latest set of issues :-)

Andrus


On Jul 17, 2007, at 12:06 AM, Greg Boshart wrote:

Thanks Andrus. It appears that the stored procedure issue is resolved with newer drivers from Oracle. (I've pasted the manifest information for the two different jar files that were tested at the end of this email.) I tried updating my drivers at the beginning of this process but I guess my classpath was not updated appropriately.

The issue was due to an erroneous value being returned by the CallableStatement.getUpdateCount() method. It should have been returning a -1 to indicate that there were no more results to be returned. Instead, it was returning 1 which locked the code in an infinite loop.

The code block that was executing is from the ProcedureAction.performAction() method:

            // read the rest of the query
            while (true) {
                if (statement.getMoreResults()) {
                    ResultSet rs = statement.getResultSet();
                    try {
                        RowDescriptor descriptor = describeResultSet(
                                rs, processedResultSets++);
readResultSet(rs, descriptor, query, observer);
                    }
                    finally {
                        try {
                            rs.close();
                        }
                        catch (SQLException ex) {
                        }
                    }
                }
                else {
int updateCount = statement.getUpdateCount (); // ß erroneously returned 1 instead of -1
                    if (updateCount == -1) {
                        break;
                    }
                    QueryLogger.logUpdateCount(updateCount);
                    observer.nextCount(query, updateCount);
                }
            }

Bad Jar Manifest info:

Manifest-Version: 1.0
Implementation-Version: "Oracle JDBC Driver version - 10.1.0.2.0"
Specification-Title: "Oracle JDBC driver classes for use with JDK1.4"
Specification-Version:  "Oracle JDBC Driver version - 10.1.0.2.0"
Implementation-Title:   "ojdbc14.jar"
Created-By: 1.2.2 (Sun Microsystems Inc.)
Implementation-Time:    "Wed Jan 21 00:48:12 2004"
Implementation-Vendor:  "Oracle Corporation"
Specification-Vendor:   "Oracle Corporation" .

Successful Manifest info:
Manifest-Version: 1.0
Implementation-Version: "Oracle JDBC Driver version - 10.1.0.5.0"
Specification-Title: "Oracle JDBC driver classes for use with JDK1.4"
Specification-Version:  "Oracle JDBC Driver version - 10.1.0.5.0"
Implementation-Title:   "ojdbc14.jar"
Created-By: 1.2.2 (Sun Microsystems Inc.)
Implementation-Time:    "Wed Dec 28 05:06:13 2005"
Implementation-Vendor:  "Oracle Corporation"
Specification-Vendor:   "Oracle Corporation" .

Greg

-----Original Message-----
From: Andrus Adamchik [mailto:[EMAIL PROTECTED]
Sent: Saturday, July 14, 2007 2:25 PM
To: [email protected]
Subject: Re: problems with Oracle stored procedure


On Jul 13, 2007, at 5:58 PM, Greg Boshart wrote:

Thanks Andrus, I appreciate your help.  What version of Cayenne are
you using?

I tested both 2.0.3 and 3.0M1 (essentially trunk code).

First I ran an unchanged unit test suite against 2.0.3 code. Namely this test:

https://svn.apache.org/repos/asf/cayenne/main/branches/STABLE-2.0/
cayenne/cayenne-java/src/tests/java/org/apache/cayenne/access/
DataContextProcedureQueryTst.java

against this procedure definition:

https://svn.apache.org/repos/asf/cayenne/main/branches/STABLE-2.0/
cayenne/cayenne-java/src/tests/resources/ddl/oracle/create-update- sp.sql

It passed. But since it does manual transaction management, I did another test against the trunk, removing transaction code from the procedure, and from the unit test. I.e. it was running under default Cayenne transaction management. It passed again.


What about your Oracle JDBC drivers?

 From the driver jar MANIFEST.MF:

Specification-Version:  Oracle JDBC Driver version - "10.2.0.1.0"
Implementation-Version: Oracle JDBC Driver version - "10.2.0.1.0"
Implementation-Vendor:  Oracle Corporation
Implementation-Time:    Wed Jun 22 18:55:48 2005


Does your stored procedure mapping look like:

        <procedure name="cayenne_tst_upd_proc">
                <procedure-parameter name="painting_price"
type="INTEGER" direction="in"/>
        </procedure>

Yes.

Andrus


Reply via email to