package dbfit.api; import dbfit.fixture.StatementExecution; import dbfit.util.DbParameterAccessor; import dbfit.util.DbParameterAccessors; import static dbfit.util.sql.PreparedStatements.buildStoredRoutineCallText; import java.sql.PreparedStatement; import java.sql.SQLException; public class DbStoredProcedureCall { private final DBEnvironment environment; private final String name; private final DbParameterAccessors accessors; public DbStoredProcedureCall(DBEnvironment environment, String name, DbParameterAccessor[] accessors) { this.environment = environment; this.name = name; this.accessors = new DbParameterAccessors(accessors); } public String getName() { return name; } protected DbParameterAccessors getAccessors() { return accessors; } public boolean hasReturnValue() { return getAccessors().containsReturnValue(); } private int getNumberOfParameters() { return getAccessors().getNumberOfParameters(); } public String toSqlString() { return buildStoredRoutineCallText(getName(), getNumberOfParameters(), hasReturnValue()); } void bindParametersTo(StatementExecution cs) throws SQLException { getAccessors().bindParameters(cs); } public StatementExecution toStatementExecution() throws SQLException { String sql = toSqlString(); PreparedStatement ps = environment.getConnection().prepareCall(sql); StatementExecution cs; if (hasReturnValue()) { cs = environment.createFunctionStatementExecution(ps); } else { cs = environment.createStatementExecution(ps); } bindParametersTo(cs); return cs; } }