How did you check the number of rows in dual?
In 8i in SQL*Plus only a
SELECT COUNT(1) FROM dual;
gives the correct answer. Oracle returns always one row for statements like
SELECT * FROM dual;
In PL/SQL all rows are returned, so you get the ORA-01422: exact fetch returns more than requested number of rows.