Thursday, 13 March 2014

How to Generate Gape free sequence oracle

Purpose: To get next sequence number(max+1) from table, but if there is gap, fill the gap first.
Useful for small tables   

Drop Table num_seq_test;
create table num_seq_test
(num_seq number(3) );
insert into num_seq_test values(1);
insert into num_seq_test values(2);
insert into num_seq_test values(3);
insert into num_seq_test values(4);
insert into num_seq_test values(5);
insert into num_seq_test values(7);
insert into num_seq_test values(8);
insert into num_seq_test values(9);
commit;

declare
 l_my_aray dbms_sql.Number_Table;
 l_next_sr# number(3);
begin
  select num_seq
  bulk collect into l_my_aray
  from num_seq_test
  where num_seq is not null
 -- and rownum < 1
  order by 1;
 /* When no data in table just return 1 */
 if sql%rowcount != 0
   then 
      for i in 1..l_my_aray.count
        loop
          if l_my_aray(i) != i
            then
              l_next_sr# := i ;
              exit;
          else
              l_next_sr# := i + 1  ;
          end if;
      end loop;
  else
   l_next_sr# := 1;    
  end if;     
 dbms_output.put_line(l_next_sr#);
end;

Drop Table num_seq_test;

No comments:

Post a Comment