В моем приложении vb мне нужен автогенерированный идентификатор буквенно-цифровых символов, например prd100
. Как я могу увеличить его с помощью Oracle в качестве бэкэнд?Как генерировать буквенно-цифровой идентификатор в Oracle
ответ
Любая конкретная причина, по которой это должно быть буквенно-цифровым? Если это может быть просто число, вы можете использовать Oracle sequence.
Но если вы хотите только случайную строку, вы можете использовать функцию dbms_random.
select dbms_random.string('U', 20) str from dual;
Таким образом, вы, вероятно, может объединить эти 2 идеи (в приведенном ниже коде, последовательность называется oid_seq):
SELECT dbms_random.string('U', 20) || '_' || to_char(oid_seq.nextval) FROM dual
Есть две части вашего вопроса. Во-первых, как создать буквенно-цифровой ключ. Во-вторых, как получить сгенерированное значение.
Итак, первый шаг - определить источник альфа-и числовых компонентов. В следующем примере я использую функцию USER и последовательность Oracle, но у вас будут свои собственные правила. Я поместил код для сборки ключа в триггере, который вызывается всякий раз, когда вставлена строка.
SQL> create table t1 (pk_col varchar2(10) not null, create_date date)
2/
Table created.
SQL> create or replace trigger t1_bir before insert on t1 for each row
2 declare
3 n pls_integer;
4 begin
5 select my_seq.nextval
6 into n
7 from dual;
8 :new.pk_col := user||trim(to_char(n));
9 end;
10/
Trigger created.
SQL>
Второй шаг требует использование RETURNING INTO
положения, чтобы получить сгенерированный ключ. Я использую SQL * PLUS для этого примера. Я признаюсь, что не знаю, как подключить этот синтаксис к VB. Сожалею.
SQL> var new_pk varchar2(10)
SQL> insert into t1 (create_date)
2 values (sysdate)
3 returning pk_col into :new_pk
4/
1 row created.
SQL> print new_pk
NEW_PK
--------------------------------
APC61
SQL>
И наконец, слово предупреждения.
Буквенно-цифровые ключи являются подозрительной конструкцией. Они пахнут «умными ключами», которые, по сути, немые. Интеллектуальный ключ - это значение, которое содержит несколько частей. В какой-то момент вы обнаружите, что хотите получить все строки, где ключ начинается с «PRD», что означает использование SUBSTR() или LIKE. Еще хуже то, что определение интеллектуального ключа изменится, и вам придется каскадировать сложное обновление вашей таблицы и ссылки на внешние ключи. Лучше всего использовать суррогатный ключ (число) и иметь буквенно-цифровой «ключ», определенный как отдельные столбцы с унифицированным объединенным ограничением UNIQUE, чтобы обеспечить соблюдение бизнес-правила.
SQL> create table t1 (id number not null
2 , alpha_bit varchar2(3) not null
3 , numeric_bit number not null
4 , create_date date
5 , constraint t1_pk primary key (id)
6 , constraint t1_uk unique (alpha_bit, numeric_bit)
7 )
8/
Table created.
SQL>
Фактически iam использует 5 или 6 идентификаторов, таких как customer_id, Product_id, Bill_ID и т. Д., Поэтому невозможно указать идентификатор номера. – banita
@banita, я не уверен, что понимаю, почему это решение не работает для вас. Наверняка вы просто создаете последовательность Oracle для каждого из нужных вам идентификаторов? – ninesided
Бу как я буду наращивать vb во время выполнения. – banita