1) In the scheduler, a job is an object that is owned by the schema (like any other objects) so it must have a unique name. So you could do something like:
for i in 1 .. 10 loop
dbms_scheduler.create_job('MYJOB'||i, .... );
end loop;
2) If a scheduler job does not have a repeat interval, it will be dropped just like dbms_job, eg
SQL> begin
2 dbms_scheduler.create_job (
3 job_name => 'MYJOB',
4 job_type => 'PLSQL_BLOCK',
5 job_action => 'null;',
6 start_date => sysdate,
7 enabled => true,
8 comments => 'One off job');
9 end;
10 /
PL/SQL procedure successfully completed.
SQL>
SQL> select job_name from user_scheduler_jobs;
JOB_NAME
--------------------------------------------------------------
MYJOB
SQL> -- a short time later
SQL> /
no rows selected
3) There is a lot more flexibility with the scheduler. The concept of a job retrying and ultimately no longer running is still there, but there is a lot of other options as well in terms of monitoring them, or reacting to a failure. For example, you can be emailed on an error, or you can have the scheduler raise an "event" when a job fails, which could trigger other jobs etc.
Check out the details here
https://docs.oracle.com/cd/E18283_01/server.112/e17120/scheduse008.htm