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.
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
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).
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
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:]Envoyé par Magnus
C'est exactement ça :Envoyé par laurentschneider
Merci bien.
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
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).
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
non, je ne le sais pas à l'avanceEnvoyé 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![]()
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager