package org.hibernate.procedure;

/**
 * Defines support for executing database stored procedures and functions and accessing its outputs.
 * <p/>
 * First a reference to  {@link ProcedureCall} is obtained through one of the overloaded
 * {@link org.hibernate.Session#createStoredProcedureCall} methods.  The ProcedureCall reference is then used to "configure"
 * the procedure call (set timeouts, etc) and to perform parameter registration.  All procedure parameters that the
 * application wants to use must be registered.  For all IN and INOUT parameters, values can then be bound.
 * <p/>
 * At this point we are ready to execute the procedure call and start accessing the outputs.  This is done by first
 * calling the {@link ProcedureCall#getResult()} method.  The underlying JDBC call is executed as needed.  The pattern to
 * access the returns is iterating through the outputs while {@link ProcedureResult#hasMoreReturns()} returns {@code true} and
 * calling {@link ProcedureResult#getNextReturn()} during iteration:
 * <code>
 *     ProcedureCall call = session.createStoredProcedureCall( "some_procedure" );
 *     ...
 *     ProcedureResult result = call.getResult();
 *     while ( result.hasMoreReturns() ) {
 *         final Return rtn = result.getNextReturn();
 *         if ( rtn.isResultSet() ) {
 *             handleResultSetReturn( (ResultSetReturn) rtn );
 *         }
 *         else {
 *             handleUpdateCountReturn( (UpdateCountReturn) rtn );
 *         }
 *     }
 * </code>
 * <p/>
 * Finally output parameters can be accessed using the overloaded {@link ProcedureResult#getOutputParameterValue} methods.
 * For portability amongst databases, it is advised to access the output parameters after all returns have been
 * processed.
 *
 * @see org.hibernate.Session#createStoredProcedureCall(String)
 * @see org.hibernate.Session#createStoredProcedureCall(String, Class[])
 * @see org.hibernate.Session#createStoredProcedureCall(String, String...)
 */