Bonjour,
J'aimerais pouvoir forcer une colonne de type char de l'une des tables de ma base de données Oracle à n'accpeter que les mots se composant exactement de 3 lettres et de 4 chiffres.
Comment ajouter cette contrainte svp ?
Merci ;)
Version imprimable
Bonjour,
J'aimerais pouvoir forcer une colonne de type char de l'une des tables de ma base de données Oracle à n'accpeter que les mots se composant exactement de 3 lettres et de 4 chiffres.
Comment ajouter cette contrainte svp ?
Merci ;)
Regardez du côté des expressions régulières si vous êtes au moins en 10g.
Cela veut dire que:
1. les expression régulières n'existent ni dans Oracle 8 ni Oracle 9
2. Il faut avoir donc une version Oracle 10g ou 11g
Pour la syntaxe voir :
http://download.oracle.com/docs/cd/B...ix.htm#i691974
Merci, mais le site contient la syntaxe des expressions régulières, moi je parlais de la syntaxe de la requete dans laquelle on fait appel aux exp. régulières ;)
Il faut utiliser REGEXP_LIKE et les fonctions
- REGEXP_INSTR
- REGEXP_REPLACE
- REGEXP_SUBSTR
Voir SQL Reference http://download.oracle.com/docs/cd/B...b14200/toc.htm
Salut Tunisiano,
Regarde ce petit exemple et teste-le si tu es en Oracle >= 10g.
Si tu ne comprends pas tout, demande :roll:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 CREATE TABLE MA_TABLE(ID, CHAMP) AS SELECT LEVEL , LPAD(TRUNC(DBMS_RANDOM.VALUE(1, 999)), 3, '0') || DBMS_RANDOM.STRING('U', 4) FROM DUAL CONNECT BY LEVEL <= 10; INSERT INTO MA_TABLE VALUES (100, '123456'); INSERT INTO MA_TABLE VALUES (100, 'ABCDEF'); COMMIT; ALTER TABLE MA_TABLE ADD CONSTRAINT PK_MA_TABLE PRIMARY KEY(ID) ; DELETE MA_TABLE WHERE ID = 100; ALTER TABLE MA_TABLE ADD CONSTRAINT PK_MA_TABLE PRIMARY KEY(ID) ; INSERT INTO MA_TABLE VALUES (100, '123456'); INSERT INTO MA_TABLE VALUES (101, 'ABCDEF'); ALTER TABLE MA_TABLE ADD CONSTRAINT CK_FORMAT CHECK (REGEXP_LIKE(CHAMP, '^[[:digit:]]{3}[[:alpha:]]{4}$')) ENABLE NOVALIDATE; SELECT ID FROM MA_TABLE WHERE NOT REGEXP_LIKE(CHAMP, '^[[:digit:]]{3}[[:alpha:]]{4}$'); DELETE MA_TABLE WHERE ID IN (SELECT ID FROM MA_TABLE WHERE NOT REGEXP_LIKE(CHAMP, '^[[:digit:]]{3}[[:alpha:]]{4}$') ); ALTER TABLE MA_TABLE ENABLE VALIDATE CONSTRAINT CK_FORMAT ; INSERT INTO MA_TABLE VALUES (100, '123456'); INSERT INTO MA_TABLE VALUES (101, 'ABCDEF');
Avec des length, ltrim et rtrim c'est facile à gérer
Code:
1
2
3 length(champ) = 7 AND length(rtrim(champ, '0123456789')) = 3 AND length(ltrim(lower(champ), 'abcdefghijklmnopqrstuvwxyz')) = 4