IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Erreur sur fonction numérique


Sujet :

SQL Oracle

  1. #1
    Inscrit
    Inscrit en
    Avril 2004
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 193
    Points : 94
    Points
    94
    Par défaut Erreur sur fonction numérique
    Bonjour,
    J'ai une table avec plus 60 millions de lignes alphanumériques et numériques (456AA,66545,etc..) je souhaite exclure dans une requete tous ce qui numérique donc
    je crée une fonction comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE OR REPLACE FUNCTION est_nombre (p_chaine IN VARCHAR2)
       RETURN INT
    IS
       v_num NUMBER;
    BEGIN
       v_num := TO_NUMBER(p_chaine);
       RETURN 1;
    EXCEPTION
    WHEN VALUE_ERROR THEN
       RETURN 0;
    END est_nombre;
    Je lance une requête comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select clef from maTable where est_nombre(clef)=1;
    ce qui doit me sortir uniquement que les numériques.

    J'ai constaté dans le résultat qu'il ya toujours des clefs alphanumériques avec comme particularité uniquement la lettre "e" exemple(9e981,9e994, etc..).

    J'ai effectué des test :

    Avec la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select est_nombre('9e981') from dual;
    -->il me renvoie 1 ce qui est faux.

    Autre part avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select to_number('9e981') from dual;
    ---> oracle lance cette erreur ora:01722 "nombre non valide".

    Est ce que y'a possibilité d'optimiser ma fonction.


    Je suis sous Oracle 11G

    Merci

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 804
    Points
    30 804
    Par défaut
    Citation Envoyé par Herveg Voir le message
    J'ai constaté dans le résultat qu'il ya toujours des clefs alphanumériques avec comme particularité uniquement la lettre "e" exemple(9e981,9e994, etc..).
    C'est normal, la lettre E est utilisée dans les notations scientifiques des nombres (19e2 est égal 19 * 102 soit 1900)

    Pourquoi se fatiguer à écrire une fonction alors que tu peux faire la même chose avec REGEXP_LIKE ?
    regexp_like(ma_colonne, '^[0-9]+$') est vrai si le nombre est un entier.

    Pour un nombre décimal, c'est à peine plus compliqué : regexp_like(ma_colonne, '^[0-9]+(' || to_char(0, 'fmd') || '[0-9]+)?'$)
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Est-ce que tu as des nombres à virgule ?

    Si non, alors simplement faire

    Pour les nombres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select clef from maTable where LTRIM(clef, '0123456789') IS NULL
    Voir si rajouter AND clef is not null

    Pour les non-nombre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select clef from maTable where LTRIM(clef, '0123456789') IS NOT NULL
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    Inscrit
    Inscrit en
    Avril 2004
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 193
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    C'est normal, la lettre E est utilisée dans les notations scientifiques des nombres (19e2 est égal 19 * 102 soit 1900)

    Pourquoi se fatiguer à écrire une fonction alors que tu peux faire la même chose avec REGEXP_LIKE ?
    regexp_like(ma_colonne, '^[0-9]+$') est vrai si le nombre est un entier.

    Pour un nombre décimal, c'est à peine plus compliqué : regexp_like(ma_colonne, '^[0-9]+(' || to_char(0, 'fmd') || '[0-9]+)?'$)
    Vous avez raison, j'ai pas pensé avec les expressions régulières.

    Merci pour vos contributions

  5. #5
    Inscrit
    Inscrit en
    Avril 2004
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 193
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par McM Voir le message
    Est-ce que tu as des nombres à virgule ?

    Si non, alors simplement faire

    Pour les nombres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select clef from maTable where LTRIM(clef, '0123456789') IS NULL
    Voir si rajouter AND clef is not null

    Pour les non-nombre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select clef from maTable where LTRIM(clef, '0123456789') IS NOT NULL

    non j'ai pas virgule.

    Merci j'opte pour les expressions régulières c'est plus simple

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    regexp est plus lourd (10x plus lent )

    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
    26
    27
    28
    29
    DECLARE
    d1 number; d2 NUMBER; v NUMBER;
    BEGIN
    	FOR i IN 1..5
      LOOP
    	d1 := DBMS_UTILITY.get_time;
    SELECT COUNT(*) INTO v FROM ARTICLE WHERE REGEXP_LIKE(article, '^[0-9]+$');
      d2 := DBMS_UTILITY.get_time;
      DBMS_OUTPUT.put_line('REGEXP '|| v ||' :'|| (d2-d1));
    	END LOOP;
    	FOR i IN 1..5
      LOOP
    	d1 := DBMS_UTILITY.get_time;
    SELECT COUNT(*) INTO v FROM ARTICLE WHERE LTRIM(article, '0123456789') IS NULL;
      d2 := DBMS_UTILITY.get_time;
      DBMS_OUTPUT.put_line('LTRIM '|| v ||' :'|| (d2-d1));
    	END LOOP;
    END;
     
    REGEXP 693333 :178
    REGEXP 693333 :169
    REGEXP 693333 :170
    REGEXP 693333 :170
    REGEXP 693333 :172
    LTRIM 693333 :12
    LTRIM 693333 :12
    LTRIM 693333 :11
    LTRIM 693333 :12
    LTRIM 693333 :12
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur sur fonction READ (Communication Série)
    Par Kartoon67 dans le forum LabVIEW
    Réponses: 11
    Dernier message: 22/04/2009, 13h40
  2. Erreur sur fonction d'extraction des mots
    Par Siguillaume dans le forum Langage
    Réponses: 16
    Dernier message: 11/06/2008, 10h16
  3. Erreur sur Fonction PL/SQL
    Par boudou dans le forum PL/SQL
    Réponses: 2
    Dernier message: 22/10/2007, 08h34
  4. [MySQL] Erreur sur fonction PHP
    Par lothar59 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 04/03/2007, 11h31
  5. Erreur sur fonction
    Par all4linux dans le forum C
    Réponses: 2
    Dernier message: 30/06/2006, 10h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo