如何在Oracle中生成字母数字id

时间:2010-03-25 13:09:17

标签: oracle

在我的vb应用程序中,我想要一个自动生成的字母数字字符ID,例如prd100。如何使用Oracle作为后端来增加它?

2 个答案:

答案 0 :(得分:3)

任何特殊原因需要使用字母数字?如果它只是一个数字,您可以使用Oracle sequence

但是如果你只想要一个随机字符串,你可以使用dbms_random函数。

select dbms_random.string('U', 20) str from dual;

所以你可以将这两个想法结合起来(在下面的代码中,序列称为oid_seq):

SELECT dbms_random.string('U', 20) || '_' || to_char(oid_seq.nextval) FROM dual

答案 1 :(得分:3)

您的问题分为两部分。第一个是如何创建字母数字键。第二个是如何获得生成的值。

所以第一步是确定alpha和数字组件的来源。在下面的示例中,我使用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>