Мне нужно создать последовательность Oracle 12c и преобразовать ее из числа в трехсимвольную строку в формате 001
, 002
, 003
и т. д.
Вот пример последовательности:
CREATE SEQUENCE supplier_seq
MINVALUE 1
MAXVALUE 999
START WITH 1
INCREMENT BY 1
CACHE 1;
Взяв приведенную выше последовательность, мне теперь нужно преобразовать ее в строку из трех символов, как показано выше.
Да, конечно - последовательность числовая. Предполагая, что я оставлю последовательность как есть и, судя по ее внешнему виду, тип данных столбца — VARCHAR2 — могу ли я просто использовать LPAD?
я бы сказал, что вы не можете увеличивать varchar2. вы можете обработать его перед вставкой триггера
@hotfix - звучит хорошо.
Если ваш вопрос заключается в том, как преобразовать число в трехсимвольную строку, я бы использовал to_char(supplier_seq.nextval, 'FM000')
. Но это зависит от того, что вы с ним делаете.
Всем спасибо за помощь - обновлен оригинальный вопрос. @AlexPoole, если бы вы могли добавить свой комментарий в качестве решения, это было бы здорово.
Вы используете сгенерированную последовательность для создания значений числовой для столбца первичного ключа (предположительно). Формат 003
— Только, связанный с презентацией (отчеты и т. д.). Лучший вариант — сохранить значения в числовом формате. Всякий раз, когда вам нужно настоящее время их как строки, используйте to_char(supplier_seq, 'fm009')
. Обратите внимание на fm, в частности; без него числа будут иметь начальный пробел (заполнитель для знака плюс или минус).
@ Radagast81 - в Oracle последовательности работают иначе.
В чем преимущество хранения числового значения в виде строки символов, дополненной начальными нулями? Пытливые умы хотят знать.
@APC спасибо за разъяснения, но я думаю, что вы все равно можете получить промежутки в 20 с кешем, установленным на 20, чего вы хотите избежать, если в последовательности у вас есть только 1 тыс. значений. Я знаю, что пробелы в последовательностях — это нормально, но с таким малым количеством возможных значений вы хотите избегать их, насколько это возможно...
Невозможно использовать единственную последовательность.
Но да, вы можете использовать следующую функцию везде, где используется последовательность, для преобразования значений последовательности в требуемый формат.
SELECT LPAD(supplier_seq.nextval,3,0) FROM DUAL; -- 001, 002, 003
Надежда, это то, что вы ищете.
Число не имеет лидирующих нулей. Вы мог сохраняете его как строку, дополненную нулями, но обычно вы сохраняете ее как число. Как вы будете использовать это, чтобы предоставить значение первичного ключа? Какой тип данных представляет собой столбец таблицы, который вы будете заполнять последовательностью?