Как сгенерировать буквенно-цифровой идентификатор в Oracle - PullRequest
2 голосов
/ 25 марта 2010

В моем приложении vb я хочу автоматически сгенерированный идентификатор буквенно-цифровых символов, например prd100. Как я могу увеличить его, используя Oracle в качестве бэкэнда?

Ответы [ 2 ]

3 голосов
/ 25 марта 2010

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

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

Есть какая-то конкретная причина, по которой он должен быть буквенно-цифровым? Если это может быть просто число, вы можете использовать последовательность Oracle .

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