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
Version imprimable
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 tzCode:
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éesCode:
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]Citation:
Envoyé par laurentschneider
Code:
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:
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:
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).
le besoin est juste de connaître le type de la variable, non le type du contenu
je vais donc utiliser le DUMP et trier les résultats selon la valeur du 'typ'
merci ;)
edit: si je veux juste le type, je dois traiter le résultat du DUMP comme une chaîne de caractères à tronquer, y a pas plus simple?
d'où vient ta variable?
si c'est une colonne d'une table, tu as user_tab_columns.data_type, non?
essaye avec [[:digit:]] au lieu de [:digit:]Citation:
Envoyé par Magnus
C'est exactement ça :Citation:
Envoyé par laurentschneider
Merci bien.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 10g SOC5> select * 2 from dvp; INCONNUE ------------------------- 12A 12500 456 5 xxx uiop 5 ligne(s) sélectionnée(s). 10g SOC5> select inconnue 2 from dvp 3 where regexp_like(inconnue, '[[:digit:]]'); INCONNUE ------------------------- 12A 12500 456 5 4 ligne(s) sélectionnée(s).
non, je ne le sais pas à l'avanceCitation:
Envoyé par laurentschneider
mais je me suis arrangé pour n'avoir que des nombres et des chaînes, que je mets dans un VARCHAR2, et comme Oracle change implicitement le type NUMBER en VARCHAR dans ce cas, je n'ai plus de pb ;)
merci :D