Написание хранимой процедуры оракула для создания уникального серийного номера?

Мне нужно сгенерировать уникальный серийный номер в нашем веб-приложении.

Я создал таблицу SerialNumber, в которой будет только одна строка. Вначале он будет иметь значение, подобное «0000000000», десять раз ноль. Это значение будет увеличиваться на единицу каждый раз, когда необходимо сгенерировать серийный номер.

например 0000000001, 0000000002 и так далее.

Я сохранил тип данных столбца как Integer, в котором хранятся значения как 0, 1, 2 и т. д., а не как 0000000001. Я хочу, чтобы серийный номер состоял из десяти цифр только с нулями, добавленными в начале.

Пожалуйста, помогите мне написать хранимую процедуру для этого.


person ashishjmeshram    schedule 30.04.2012    source источник


Ответы (2)


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

Я не знаю стоит вашего требования, но, скорее всего, вам лучше подойдет последовательность. Использование таблицы для создания уникальных идентификаторов обычно является плохим выбором, который следует пересмотреть.

Что касается хранимой процедуры вместе с последовательностью, базовым фреймом для построения может быть:

Последовательность:

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;
/
person René Nyffenegger    schedule 30.04.2012
comment
+1 за указание использовать последовательность. Выполнение этого из таблицы вызовет узкое место, если ваше приложение будет занято. - person Karl; 30.04.2012
comment
@ Рене Ниффенеггер. У меня могут быть записи, вставленные в таблицу с серийными номерами, сгенерированные из какого-то внешнего источника. В этом случае мне также нужно будет проверить, не совпадает ли серийный номер, сгенерированный функцией, с каким-либо из существующих серийных номеров в системе. И это не в моей власти, так как у нас обязательно будет sn. из других источников. У меня нет другого выбора, кроме как проверить в БД. Как я могу проверить это в функции? - person ashishjmeshram; 30.04.2012
comment
@Ashish, что когда-либо поступает из внешнего источника, вы можете сохранить в таблице, а затем сравнить это значение со значением, сгенерированным функцией, предоставленной Рене Ниффенеггером. - person psaraj12; 30.04.2012
comment
@psaraj12. Поэтому мне нужно будет получить NewSerial(), проверить в БД, если существует getNewSerial(), проверить в БД, если существует, getNewSerial проверить в БД, если не существует возврата. Но как мне реализовать это в моей остановленной процедуре? - person ashishjmeshram; 30.04.2012
comment
@psaraj12. Извините, а я не нашел? Куда ты его положил? - person ashishjmeshram; 30.04.2012
comment
@Ashish, вы можете проверить использование MAX_SR_NO и final_value в предоставленных блоках ответов. - person psaraj12; 30.04.2012
comment
@Ashish Извините, я отредактировал ответ Рене Ниффенеггера, который должен быть проверен экспертами. - person psaraj12; 30.04.2012
comment
@Ashish: я не знал, что могу/должен рецензировать отредактированные ответы. Но это сделано сейчас. - person René Nyffenegger; 30.04.2012
comment
@ Рене Ниффенеггер. Привет. Другая таблица будет иметь такие значения, как 0000000002, 0000000003, 0000000006, 0000000008, 1100000002, 1100000003 и т. д. очень случайные. Если наша функция создает значение вроде 0000000008, как в этом случае работает описанная выше процедура. потому что другая система очень непредсказуема в генерации серийных номеров. Возможно, он уже создал несколько серийных номеров в таблице, которые еще не созданы нашей последовательностью. В этом случае эта МАКСИМАЛЬНАЯ вещь не будет работать. - person ashishjmeshram; 30.04.2012
comment
Я думаю, вам следует открыть новый вопрос, конкретно касающийся вашей проблемы. Это определенно не входит в сферу этого вопроса. В другом вопросе вы должны определить, что такое непредсказуемость, чего вы ожидаете от системы и чего пытаетесь достичь. - person René Nyffenegger; 30.04.2012
comment
@Ashish В своем вопросе вы сказали, что таблица серийных номеров будет увеличиваться на единицу каждый раз, когда необходимо создать серийный номер, но теперь ваш комментарий совершенно другой. - person psaraj12; 30.04.2012

Пожалуйста, используйте

lpad(serial_no, 10, '0');

больше информации на

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

и также лучше использовать последовательность в оракуле, кроме хранения в таблице

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

person psaraj12    schedule 30.04.2012