Следующая последовательность для 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

Другие вопросы по тегам