/* Calls the DB2 stored procedure passing in the request string * as the first parameter and the metadata string as the second * parameter. If xmlRequestString contains a script or no output * metadata is required the xmlMetadata parameter may be null. * The outputMetadata boolean controls what is returned by the * method. If it is true any output metadata is returned. If * false the response output is returned. */ private String callDB2StoredProc(String xmlRequestString, String xmlMetadataString, boolean outputMetadata) throws OCException, OCApiException { /* Create an SQL command to call the Stored procedure in DB2 * to get the XML */ String sql = "CALL db2info.MD_MESSAGE (?, ?, ?)"; String response = null; String xmlMetadataResponse = null; CallableStatement callStmt = null;
try { callStmt = auroraCatalogConnection.prepareCall(sql);
/* Set input parameter to request and metadata strings. */ callStmt.setString (1, xmlRequestString); callStmt.setString (2, xmlMetadataString);
/* Register the output parameters. */ callStmt.registerOutParameter (2, Types.VARCHAR); callStmt.registerOutParameter (3, Types.VARCHAR);
/* Call the stored procedure */ callStmt.execute();
/* Retrieve output parameters. If the procedure was called with * a request that returns metadata in the middle parameter then * xmlMetadataResponse will store the output XML. */ if (outputMetadata == true) xmlMetadataResponse = callStmt.getString(2); response = callStmt.getString(3);
/* See if there are any warnings. */ SQLWarning warning = callStmt.getWarnings();
/* If execute returns a warning with a non-zero SQL state * then the API has had an error and returned some response * info in the output XML document. */ if (warning != null) { OCLog.trace("Stored procedure execute returned a warning."); OCLog.trace("SQL state: " + warning.getSQLState()); OCLog.trace("SQL state: " + warning.getErrorCode());
/* readResponseFromXML will throw an OCApiException containing * the error info (which will then be thrown to our caller) or * it will throw an OCException if a parsing error occurred. If * for some strange reason the file does not contain error * info it will just return and then we'll throw an OCException * to notify the user. */ try { readResponseFromXML(response); }
/* If an API exception was thrown add the SQL state etc to * it and then throw it again. */ catch (OCApiException apie) { apie.setSqlException(warning);
throw apie; } /* If we have had a warning we always want to rollback any changes. * If we have a problem rolling back the exception will be caught * below. */ finally { auroraCatalogConnection.rollback(); }
/* If we got here there must have been a warning with nothing * in the output XML so throw an exception explaining this. */ throw new OCException("OC_ERR_API_DB2_STORED_PROC_FAIL_NO_INFO"); } } /* If we had an error executing the SQL, log the information and * throw an exception. We also rollback any changes and catch * the exception if the rollback has a problem. */ catch (SQLException e) { OCApiException newe = new OCApiException(e); OCLog.trace( newe.getMessage() ); logExceptionInfo(e);
try { auroraCatalogConnection.rollback(); } catch (SQLException e2) { OCLog.trace("An exception also occurred rolling back."); logExceptionInfo(e2); }
throw newe; }
|