PROCEDURE emp_per_year
   IS
  sy number;
  ey number;
  c  number;
BEGIN
  select min(EXTRACT(year from hire_date)), max(EXTRACT(year from hire_date)) into
     sy, ey from employees;
     
/*  select min(y), max(y) into sy, ey from
    (select extract(year from hire_date) y from employees);     */

  for i in sy..ey loop
    select count(*) into c from employees where EXTRACT(year from hire_date) = i;
    dbms_output.put_line(i|| ' : ' || c);
  end loop;
END; -- Procedure
with list_year as (
select level-1 + 
(select extract(year from min(hire_date)) from emp)
as yl from dual connect by level <= 
(select extract(year from max(hire_date)) -
        extract(year from min(hire_date)) + 1
from emp) 
)
select yl, count(employee_id) from emp right join
  list_year on yl = extract(year from hire_date)
  group by yl
  order by yl