class ExecuteProcedure extends ExecuteStatement {

    private final Procedure procedure;

    public ExecuteProcedure(ServerSession session, Procedure procedure) {
        super(session);
        this.procedure = procedure;
    }

    @Override
    public boolean isQuery() {
        return stmt().isQuery();
    }

    @Override
    public Future<Result> getMetaData() {
        return stmt().getMetaData();
    }

    private StatementBase stmt() {
        return (StatementBase) procedure.getPrepared();
    }

    private void setParameters() {<FILL_FUNCTION_BODY>}

    @Override
    public int update() {
        setParameters();
        return stmt().update();
    }

    @Override
    public Result query(int limit) {
        setParameters();
        return stmt().query(limit);
    }
}

        ArrayList<Parameter> params = stmt().getParameters();
        if (params == null)
            return;
        int size = Math.min(params.size(), expressions.size());
        for (int i = 0; i < size; i++) {
            Expression expr = expressions.get(i);
            Parameter p = params.get(i);
            p.setValue(expr.getValue(session));
        }
    
<methods>public void <init>(com.lealone.db.session.ServerSession) ,public int getType() ,public void setExpression(int, com.lealone.sql.expression.Expression) <variables>protected final ArrayList<com.lealone.sql.expression.Expression> expressions