2010-03-25 1 views

ответ

3

Любая конкретная причина, по которой это должно быть буквенно-цифровым? Если это может быть просто число, вы можете использовать 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 
+0

Фактически iam использует 5 или 6 идентификаторов, таких как customer_id, Product_id, Bill_ID и т. Д., Поэтому невозможно указать идентификатор номера. – banita

+0

@banita, я не уверен, что понимаю, почему это решение не работает для вас. Наверняка вы просто создаете последовательность Oracle для каждого из нужных вам идентификаторов? – ninesided

+0

Бу как я буду наращивать vb во время выполнения. – banita

3

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

Итак, первый шаг - определить источник альфа-и числовых компонентов. В следующем примере я использую функцию 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>