Search code examples
oracle-databasestored-proceduresgeneratorserial-number

Writing a oracle stored procedure to generate a unique serial number?


I need to generate a unique serial number in our web application.

I have created a table called SerialNumber which will have only one row. In the begining it will have value like '0000000000' ten times zero. This will be incremented by one every time a serial number needs to be generated.

e.g. 0000000001, 0000000002 and so on.

I have kept the column datatype as Integer which stores values as 0, 1, 2 etc and not as 0000000001. I want the serial number to be ten digits only with zeros appended at the begining.

Please help me to write the stored proc for this.


Solution

  • select to_char(<column-value>, 'FM0000000000') from serialNumber;
    

    I don't know what's behind your requirement, but most probably, you are better served with a sequence. Using a table to generate unique ids is usually a poor choice that should be reviewed.

    As for a stored procedure along with a sequence, a basic frame to build upon could be:

    The sequence:

    create sequence serial_number_seq;
    

    The stored procedure (actually: a function)

    create or replace function next_serial_number return varchar2 as
    
           serial_number_ number;
           MAX_SR_NO number;
    begin
    
           select serial_number_seq.nextval into serial_number_ from DUAL;
    
           Select MAX(sr_no) INTO MAX_SR_NO from serialNumber;
    
           serial_number_ := GREATEST(serial_number_, MAX_SR_NO); 
    
           return to_char(serial_number_, 'FM0000000000');
    
    end    next_serial_number;
    /
    

    testing

    begin
      dbms_output.put_line(next_serial_number);
      dbms_output.put_line(next_serial_number);
      dbms_output.put_line(next_serial_number);
      dbms_output.put_line(next_serial_number);
      dbms_output.put_line(next_serial_number);
      dbms_output.put_line(next_serial_number);
    -- in the place where you use the serial number the greatest 
    --  of inserted value from external system or sequence value will be used
     final_value:= next_serial_number;
    end;
    /