instead of the "dual connect by trick"
use all_objects - presuming the size of all_objects is big enough.
ops$tkyte@ORA9I> with data as
2 (select sysdate startdate, sysdate+rownum-1 thedate
3 from all_objects
4 where rownum <= to_date(:todate,'dd-mon-yyyy') -trunc(sysdate)+1
5 )
6 select startdate,
7 thedate
8 from data where
9 to_char(thedate,'dy') in ('sat','sun')
10 order by thedate
11 /
STARTDATE THEDATE
--------- ---------
16-APR-08 19-APR-08
16-APR-08 20-APR-08
16-APR-08 26-APR-08
16-APR-08 27-APR-08