Lo farebbe se lo chiamassi, ma purtroppo non lo fai.
Questo non è un problema SQL, è un problema logico. Se non laviamo noi i piatti restano sporchi. Allo stesso modo, se non chiami la routine che elimina i record, i record non vengono eliminati.
Devi chiamare la funzione nella procedura. Non sono sicuro del motivo per cui l'hai resa una funzione e non verrà comunque compilata, perché non ha una clausola RETURN. Quindi, risolviamo anche quello.
CREATE OR REPLACE FUNCTION DELETE_ALL_STUDENTS RETURN NUMBER AS
BEGIN
DELETE FROM STUDENTS;
return sql%rowcount; -- how many rows were deleted
END;
/
Ora lo chiamiamo:
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;
Quindi, quando esegui il blocco anonimo, gli studenti esistenti verranno eliminati e sostituiti con quelli nuovi.