在我的vb应用程序中,我想要一个自动生成的字母数字字符ID,例如prd100
。如何使用Oracle作为后端来增加它?
答案 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>