The next_day function is your friend here. Pass the day you want as the second parameter. And it'll return the date this falls on after the one you passed.
So you can use this to look for the next Monday. Note that if the date you pass is a Monday, it'll return the following Monday. Not the input date.
So how does this help you find all the Mondays between two dates?
With a bit of maths!
Find the first and last Monday in the range. Subtract the latter from the former. This gives you the total days between the Mondays.
Divide this value by seven to get the number of weeks covered. Then add one.
To find the first Monday, subtract one from the start date (to cover for starting on Monday). Then find the next Monday.
For the last Monday, subtract seven. And next_day the result of this
Which gives:
var start_date varchar2(10);
var end_date varchar2(10);
exec :start_date := '2018-01-01';
exec :end_date := '2018-01-31';
select (
( next_day ( ( to_date ( :end_date, 'yyyy-mm-dd' ) - 7 ), 'monday' ) -
next_day ( ( to_date ( :start_date, 'yyyy-mm-dd' ) - 1 ), 'monday' )
) / 7
) + 1 number_of_mondays
from dual;
NUMBER_OF_MONDAYS
5
So what about getting the next N Mondays?
First generate N rows with your favourite row generation method.
Then take the next Monday from sysdate (remembering to subtract one if you want to include the current date if it's Monday). For each row add the number of weeks elapsed since the first. Which is the row number minus one, times seven.
Giving:
select to_char ( sysdate, 'day' ) current_day,
next_day ( sysdate, 'monday' ) + ( ( level - 1 ) * 7 ) mondays
from dual
connect by level <= 10;
CURRENT_DAY MONDAYS
thursday 06-AUG-2018
thursday 13-AUG-2018
thursday 20-AUG-2018
thursday 27-AUG-2018
thursday 03-SEP-2018
thursday 10-SEP-2018
thursday 17-SEP-2018
thursday 24-SEP-2018
thursday 01-OCT-2018
thursday 08-OCT-2018