编写oracle存储过程以生成唯一的序列号?

时间:2012-04-30 04:04:35

标签: oracle stored-procedures generator serial-number

我需要在我们的Web应用程序中生成唯一的序列号。

我创建了一个名为SerialNumber的表,它只有一行。在开始时它将具有像'0000000000'十倍零的价值。每当需要生成序列号时,这将增加1。

e.g。 0000000001,0000000002等。

我保持列数据类型为Integer,它将值存储为0,1,2等而不是0000000001.我希望序列号只有十位数,并且在开头附加零。

请帮我写这个存储过程。

2 个答案:

答案 0 :(得分:7)

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

我不知道背后你的要求是什么,但最有可能的是,你最好使用sequence。使用表格生成唯一ID通常是一个不好的选择,应该进行审核。

对于存储过程以及序列,构建的基本框架可以是:

序列:

create sequence serial_number_seq;

存储过程(实际上是:一个函数)

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;
/

测试

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;
/

答案 1 :(得分:3)

请使用

lpad(serial_no, 10, '0');

的更多信息

http://www.techonthenet.com/oracle/functions/lpad.php

除了存储在表中

之外,最好在oracle中使用序列

http://www.techonthenet.com/oracle/sequences.php