Следующая последовательность для varchar в sql?
Мне было интересно, если бы был способ сделать nextval
последовательность для varchar
значение? Я использую iSQL плюс, оракул. Например, у меня есть таблица продаж, которая состоит из sale_id
, prod_id
, cust_name
, sale_name
, где я вставляю данные, выполняя следующие действия:
insert into sales
select sale_id_seq.nextval,
trunc(dbms_random.value(1,100)),
(code for assigning random string for sale_name)
cust_id
from customer;
2 ответа
Ваш вопрос не имеет смысла. Каким будет NEXTVAL для varchar?
Если вы хотите сохранить число в столбце varchar, вы можете, но не должны. Всегда лучше держать числа в числовых столбцах.
Если хотите, вы хотите создать поток A, B, C ... Z, AA, AB ... AZ, AAA
тогда вы могли бы написать функцию, которая принимает регулярную последовательность и преобразует ее в базу 26 (или базу 36, если вы хотите перейти 1,2 ...9, A, B ... Z, 10, 11 ... 1A
). Но это много усилий для чего-то без явной выгоды.
Если вы хотите более сложные серии, такие как 2009/00000001, 2009/00000002
и т. д., что можно сделать с помощью так называемой таблицы управления кодом. Это таблица ручной работы, которая содержит последнее назначенное значение. Опять же, вам понадобится некоторый сделанный на заказ код для генерации следующего значения. У этого подхода есть некоторые серьезные ограничения, не последним из которых является то, что он сериализует ваши вставки: ваш код должен выполнить блокировку таблицы, поэтому второй пользователь не может вставить запись в CUSTOMER, пока первый пользователь не выполнит коммит (или откат).
редактировать
Я не понимаю, почему вы говорите, что DBMS_RANDOM не работает. Это ясно делает:
SQL> select dbms_random.string('U', 5)
2 from dual
3 /
DBMS_RANDOM.STRING('U',5)
--------------------------------------------------------
IROGT
SQL>
Если вы хотите что-то для генерации тестовых данных, взгляните на Swingbench/Data Generator