As Jurij says this does rather come down to a matter of taste.

Personally I prefer a non-looping PL/SQL only solution since in my experience that is typically the most efficient. However depending on your requirements it may be equally important that the solution is intuitive so that it can be properly understood and maintained by others - in general people appear to find looping solutions (whether by rows or in PL/SQL) to be more intuitive.
Code:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production

SQL> SET SERVEROUTPUT ON;
SQL> DECLARE
  2    FUNCTION named_days_between (
  3      vp_min IN DATE,
  4      vp_max IN DATE,
  5      vp_day IN VARCHAR2)
  6      RETURN NUMBER
  7    IS
  8    BEGIN
  9      RETURN TRUNC (NEXT_DAY (vp_max, vp_day) - 
 10        NEXT_DAY (vp_min - 1, vp_day)) / 7;
 11    END;
 12    
 13    FUNCTION business_days_between (
 14      vp_min IN DATE,
 15      vp_max IN DATE)
 16      RETURN NUMBER
 17    IS
 18    BEGIN
 19      RETURN vp_max - vp_min - (
 20        named_days_between (vp_min, vp_max, 'SAT') + 
 21        named_days_between (vp_min, vp_max, 'SUN')) + 1;
 22    END;
 23  BEGIN
 24    DBMS_OUTPUT.PUT_LINE ('Business Days: ' || 
 25      business_days_between (SYSDATE, SYSDATE + 15));
 26  END;
 27  /
Business Days: 12

PL/SQL procedure successfully completed.

SQL>