Help - ORA-01002 from JDBC but autoCommit is set to false (8.1.7)
Date: Tue, 30 Oct 2001 21:47:53 GMT
Message-ID: <deFD7.525229$8c3.89138043_at_typhoon.tampabay.rr.com>
Hey all,
I'm struggling to figure out why I'm getting this message. I am explicitly setting autoCommit to false. The writes to the table occur in multiple loops.
Here is a code snippet:
... snip ...
private static final String insSql = "INSERT INTO THETABLE(TREEENTRYID, ATTRCATEGORY, ATTRID, ATTRBINARYVALUE) VALUES(?,?,?,empty_blob())";
private static final String updSql = "SELECT ATTRBINARYVALUE FROM THETABLE WHERE TREEENTRYID = ? AND ATTRCATEGORY = ? AND ATTRID = ? FOR UPDATE"; private static final String CNTSQL = "{call GETDOESEXIST(?,?,?,?)}";
/* the GETDOESEXIST simply uses a count(*) from the table, and returns the result into the last parameter */
public int save(Connection con) throws SQLException, RepositoryException {
int rtn = -1;
PreparedStatement stmt;
try {
boolean autoComm = con.getAutoCommit(); int isThere = 0; con.setAutoCommit(false); // Turn off autoCommit temporarily for thistransaction...
// Is the row already there? If not, insert it, otherwise, skip down to the update
try { CallableStatement iitSt = con.prepareCall(CNTSQL); try { iitSt.setInt(1, (int)getTreeId()); iitSt.setInt(2, (int)getAttrCategory()); iitSt.setInt(3, (int)getAttrId()); iitSt.registerOutParameter(4, java.sql.Types.INTEGER); iitSt.executeUpdate(); isThere = iitSt.getInt(4); if ( iitSt.wasNull() ) { // throw an exception? isThere = 0;}
}
} finally { iitSt.close(); } BLOB theBlob = null; if (isThere == 0) { // Row isn't there - insert the row... stmt = con.prepareStatement(insSql); try { stmt.setInt(1, (int)getTreeId()); stmt.setInt(2, (int)getAttrCategory()); stmt.setInt(3, (int)getAttrId()); stmt.executeUpdate(); con.commit(); // Commit the insert
} finally {
stmt.close();
}
} // Update the existing row... stmt = con.prepareStatement(updSql); try { stmt.setInt(1, (int)getTreeId()); stmt.setInt(2, (int)getAttrCategory()); stmt.setInt(3, (int)getAttrId()); OracleResultSet rs = (OracleResultSet)(stmt.executeQuery()); try { boolean rsrtn = rs.next(); if (rsrtn) { BLOB blob = (BLOB) rs.getBLOB(1); InputStream is = new ByteArrayInputStream(getBinaryValue()); OutputStream os = blob.getBinaryOutputStream(); int bufSize = blob.getBufferSize(); byte[] buf = new byte[bufSize]; int length = 0; while ((length = is.read(buf)) != -1) { os.write(buf, 0, length); } os.flush(); os.close(); con.commit(); // Commit the update }
} finally {
rs.close();
}
} finally { stmt.close(); } rtn = 0; isDirty = false; } finally { con.setAutoCommit(autoComm); } } catch (IOException ex) { ex.printStackTrace(); throw new RepositoryIOException(ex.toString());
return rtn;
}
Thanks for any help you could provide,
Marc
- NOTE **********************
ORA-22990 LOB locators cannot span transactions
Cause: A LOB locator selected in one transaction cannot be used in a different transaction.
Action: Reselect the LOB locator and retry the operation.
:
private static final String insSql = "begin INSERT INTO THETABLE(TREEENTRYID, ATTRCATEGORY, ATTRID, ATTRBINARYVALUE) VALUES(?,?,?,empty_blob()) return ATTRBINARYVALUE into ?; end;";
private static final String updSql = "begin UPDATE THETABLE SET ATTRBINARYVALUE = empty_blob() WHERE TREEENTRYID = ? AND ATTRCATEGORY = ? AND ATTRID = ? RETURN ATTRBINARYVALUE INTO ?; end;";
private static final String CNTSQL = "{call GETDOESEXIST(?,?,?,?)}";
public int save(Connection con) throws SQLException, RepositoryException{
int rtn = -1;
try {
boolean autoComm = con.getAutoCommit(); con.setAutoCommit(false); int isThere = 0; ResultSet rs = null; try { CallableStatement iitSt = con.prepareCall(CNTSQL); try { iitSt.setInt(1, (int)getTreeId()); iitSt.setInt(2, (int)getAttrCategory()); iitSt.setInt(3, (int)getAttrId()); iitSt.registerOutParameter(4, java.sql.Types.INTEGER); iitSt.executeUpdate(); isThere = iitSt.getInt(4); if ( iitSt.wasNull() ) { // throw an exception? isThere = 0;}
}
} finally { iitSt.close(); } BLOB theBlob = null; if (isThere == 0) { OracleCallableStatement stmt = (OracleCallableStatement)con.prepareCall(insSql); try { stmt.setInt(1, (int)getTreeId()); stmt.setInt(2, (int)getAttrCategory()); stmt.setInt(3, (int)getAttrId()); stmt.registerOutParameter(4, java.sql.Types.BLOB); stmt.executeUpdate(); BLOB blob = (BLOB) stmt.getBLOB(4); InputStream is = new ByteArrayInputStream(getBinaryValue()); OutputStream os = blob.getBinaryOutputStream(); byte[] buf = new byte[1024]; int length = 0; try { while ((length = is.read(buf)) != -1) { os.write(buf, 0, length); } } finally { os.close(); }
} finally {
stmt.close();
}
} else { OracleCallableStatement stmt = (OracleCallableStatement)con.prepareCall(updSql); try { stmt.setInt(1, (int)getTreeId()); stmt.setInt(2, (int)getAttrCategory()); stmt.setInt(3, (int)getAttrId()); stmt.registerOutParameter(4, java.sql.Types.BLOB); stmt.executeUpdate(); BLOB blob = (BLOB) stmt.getBLOB(4); InputStream is = new ByteArrayInputStream(getBinaryValue()); OutputStream os = blob.getBinaryOutputStream(); byte[] buf = new byte[1024]; int length = 0; try { while ((length = is.read(buf)) != -1) { os.write(buf, 0, length); } } finally { os.close(); }
} finally {
stmt.close();
}
} rtn = 0; isDirty = false; } finally { con.commit(); con.setAutoCommit(autoComm); } } catch (IOException ex) { ex.printStackTrace(); throw new RepositoryIOException(ex.toString());
return rtn;
} Received on Tue Oct 30 2001 - 22:47:53 CET