2010-03-25 7 views

Répondre

3

Une raison particulière doit-elle être alphanumérique? Si cela peut juste être un nombre, vous pouvez utiliser un Oracle sequence. Mais si vous voulez juste une chaîne aléatoire, vous pouvez utiliser la fonction dbms_random.

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

Alors vous pourriez probablement combiner ces 2 idées (dans le code ci-dessous, la séquence est appelée oid_seq):

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

en réalité iam utilisant 5 ou 6 id comme customer_id, Product_id, Bill_ID etc. .so il n'est pas possible de donner un numéro d'identification à un. – banita

+0

@banita, je ne suis pas sûr de comprendre pourquoi cette solution ne fonctionne pas pour vous. Vous avez sûrement créé une séquence Oracle pour chacun des identifiants dont vous avez besoin? – ninesided

+0

bu comment vais-je incrémenter en vb à l'exécution. – banita

3

Il y a deux parties à votre question. Le premier est comment créer une clé alphanumérique. La seconde est comment obtenir la valeur générée.

La première étape consiste donc à déterminer la source des composantes alpha et numérique. Dans l'exemple suivant, j'utilise la fonction USER et une séquence Oracle, mais vous aurez vos propres règles. Je mets le code pour assembler la clé dans un déclencheur qui est appelé chaque fois qu'une ligne est insérée.

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> 

La deuxième étape nécessite l'utilisation de la clause RETURNING INTO pour récupérer la clé générée. J'utilise SQL * PLus pour cet exemple. J'avoue n'avoir aucune idée comment câbler cette syntaxe en VB. Pardon.

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> 

Enfin, un mot d'avertissement.

Les clés alphanumériques sont une construction suspecte. Ils empestent des "clés intelligentes" qui sont, en fait, stupides. Une clé intelligente est une valeur qui contient plusieurs parties. À un certain moment, vous aurez besoin de récupérer toutes les lignes où la clé commence par 'PRD', ce qui signifie utiliser SUBSTR() ou LIKE. Pire encore un jour la définition de la clé intelligente va changer et vous devrez mettre en cascade une mise à jour compliquée à votre table et ses clés étrangères de référencement. Un meilleur ides est d'utiliser une clé de substitution (nombre) et avoir la "clé" alphanumérique définie comme colonnes séparées avec une contrainte composite UNIQUE pour appliquer la règle métier.

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> 
Questions connexes