You mean something like this?
create or replace procedure p as
procedure do_this as
begin
dbms_output.put_line ( 'THIS' );
end do_this;
procedure do_that as
begin
dbms_output.put_line ( 'THAT' );
end do_that;
begin
do_this();
do_that();
end p;
/
Personally, I'm not a fan. As you suggest, I'd prefer to make a package, like this:
create or replace package body pkg as
procedure do_this as
begin
dbms_output.put_line ( 'THIS' );
end do_this;
procedure do_that as
begin
dbms_output.put_line ( 'THAT' );
end do_that;
procedure p as
begin
do_this();
do_that();
end p;
end;
/
The upside of defining procedures in the declaration section (nested or local subprograms) is the same as subprograms generally: you define logic in a single place that you can reuse many times. If a procedure needs to run the same process several times, this can make your code easier to maintain.
The downside is the nested subprograms are only available to the procedure that defines them. This makes them harder to test and limits reuse. In the first example above, if you find you want to call do_this() in another procedure, you need to refactor your code.
Whereas if it's a package-level procedure, you can reuse it throughout the rest of the package. Or add it to the package spec to make it publicly availalbe should you wish to.