bonjour
je cherche une fonction donnant le type de la variable, ou bien les fonctions renvoyant un booléen pour chaque type
qqch comme 'is_char' ou 'is_number'...
je n'ai pas trouvé, z'avez une idée?![]()
merki
bonjour
je cherche une fonction donnant le type de la variable, ou bien les fonctions renvoyant un booléen pour chaque type
qqch comme 'is_char' ou 'is_number'...
je n'ai pas trouvé, z'avez une idée?![]()
merki
peut-être dump
avec 1=varchar2, 2=number, 8=long, 12=date, 13=date, 23=raw, 24=long raw,69=rowid, 96=char, 100=binary_float, 101=binary_double, 112=clob, 113=blob, 114=bfile, 115=cfile, 178=time, 179=time with tz, 180=timestamp, 181=timestamp with tz, 182=interval y2m, 183=interval d2s, 208=urowid, 231=timestamp with local tz
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SQL> select dump('Hello') from dual; DUMP('HELLO') -------------------------------- Typ=96 Len=5: 72,101,108,108,111
par contre, si tu veux savoir si la chaine '123' contient un nombre, tu dois écrire ta fonction.
tu peux jouer avec les exceptions pour écrire ton is_number, mais ce n'est algorythmiquement parlant pas très élégant.
moi j'ai déjà employé des trucs du style
voire avec REGEXP en 10g pour des validations plus avancées
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 SQL> select decode(translate(c,'x0123456789','x'), null,decode(c,null,null,'ENTIER-POSITIF'),'CHAINE') from (select '&chaine' c from dual); Enter value for chaine: x DECODE ------ CHAINE SQL> select decode(translate(c,'x0123456789','x'), null,decode(c,null,null,'ENTIER-POSITIF'),'CHAINE') from (select '&chaine' c from dual); Enter value for chaine: 123 DECODE(TRANSLA -------------- ENTIER-POSITIF
Oui, d'autant que c'est déjà "tout prêt" avec la balise [:digit]Envoyé par laurentschneider
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 10g SOC5> select inconnue 2 from dvp; INCONNUE ------------------------- 12A 12500 456 3 ligne(s) sélectionnée(s). 10g SOC5> select inconnue 2 from dvp 3 where regexp_like (inconnue, '^[[:digit:]]+$'); INCONNUE ------------------------- 12500 1 ligne sélectionnée.
ou pour des nombres , pas forcément entiers positifs ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 SQL> select * from (select '&chaine' c from dual) where regexp_replace(c,'^[+-]?([[:digit:]]+(\.[[:digit:]]+)?|\.[[:digit:]]+)([eE][+-]?[[:digit:]]+)?$') is null; Enter value for chaine: xxx no rows selected SQL> / Enter value for chaine: -12.34E-56 C ---------- -12.34E-56
D'ailleurs Laurent, pourrais-tu m'expliquer ce résultat :
Pourquoi est-ce qu'il n'y a aucune correspondance tant que je n'utilise pas le symbole '*' ou '+', etc. ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 10g SOC5> r 1 select regexp_instr(inconnue, '[:digit:]'), inconnue 2* from dvp REGEXP_INSTR(INCONNUE,'[:DIGIT:]') INCONNUE ---------------------------------- ------------------------- 0 12A 0 12500 0 456 0 5 4 ligne(s) sélectionnée(s).
Partager