Seria se você o chamasse, mas, infelizmente, você não o faz.
Este não é um problema de SQL, é um problema de lógica. Se não lavarmos a louça, a louça continua suja. Da mesma forma, se você não chamar a rotina que exclui os registros, os registros não serão excluídos.
Você precisa chamar a função no procedimento. Não tenho certeza por que você fez uma função, e ela não compilará de qualquer maneira, porque não possui uma cláusula RETURN. Então, vamos corrigir isso também.
CREATE OR REPLACE FUNCTION DELETE_ALL_STUDENTS RETURN NUMBER AS
BEGIN
DELETE FROM STUDENTS;
return sql%rowcount; -- how many rows were deleted
END;
/
Agora chamamos de:
create or replace PROCEDURE DELETE_ALL_STUDENTS_VIASQLDEV AS
n number;
BEGIN
dbms_output.put_line('--------------------------------------------');
dbms_output.put_line('Deleting all student rows');
n := DELETE_ALL_STUDENTS;
dbms_output.put_line('No of students deleted = '|| to_char(n));
END;
Assim, quando você executar seu bloco anônimo, os alunos existentes serão excluídos e substituídos pelos novos.