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

PL/SQL Oracle Discussion :

Extraction d'une sous chaine numérique


Sujet :

PL/SQL Oracle

  1. #1
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 284
    Par défaut Extraction d'une sous chaine numérique
    Bonjour,

    Je cherche une fonction qui permet de trouver la position d'un chiffre dans une chaine de caractère.
    Voila mon pl, j'ai une chaine de type :
    "MONTANTS à payer Brut EUR 122 avec Credit d'impot:0 "
    et je veux extraire la valeur : 122
    Je suis sous oracle 9i

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Mai 2008
    Messages : 75
    Par défaut une fonction pour recuperer la position du premier chiffre d'une chaine
    la fonction n'est pas exhaustive mais ca peut taider j'espere
    Code sql : 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
     
    create or replace function get_position(p_chaine char) return int
    is
    v_char char;
    x_length number:=0;
    begin
    x_length:=length(p_chaine);
    for i in 1..x_length loop
     begin
       select to_number(substr(p_chaine,i,1)) into v_char
               from dual;
            if sql%found then
               return i;
            end if;
     exception
       when invalid_number then null;
     end;
    end loop;
    end;
    /

  3. #3
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Bonsoir
    Juste pour "jouer", ne peut on pas imaginer qqchose sans fonction, dans le select directement comme par ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT SUBSTR('MONTANTS à payer Brut EUR 122', INSTR('MONTANTS à payer Brut EUR 122', TRANSLATE (UPPER ('MONTANTS à payer Brut EUR 122'),
                      '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZÀ ',
                      '0123456789'
                     )), LENGTH (TRANSLATE (UPPER ('MONTANTS à payer Brut EUR 122'),
                              '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZÀ ',
                              '0123456789'
                             )
                  ))test_num
      FROM DUAL
    Maintenant, je suis conscient que c'est pas parfait avec le coup du translate puisqu'il faut être sur de pouvoir virer tous les caractères spéciaux ou accentués ou autres...

    A voir donc,
    @+

  4. #4
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 284
    Par défaut
    Bjr,

    J'utilise la fonction postée par shan08. Je parcourt ma chaine et je garde seulement les caractères de type nombre. une fois j'ai trouvé un caractère de type non nombre après d'avoir trouvé des caractères de type nombre je sort de la fonction. Voila le code:
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
     
    FUNCTION get_position(p_chaine VARCHAR2) RETURN VARCHAR2
    IS
    v_char      VARCHAR2(100);
    x_length    NUMBER;
    LN$Pos      NUMBER;
    i           NUMBER;
    res         VARCHAR2(10) := '';
    temp        NUMBER;
    v_numb      Varchar2(100);
     
     
        BEGIN
     
        temp := 0;
        x_length := 0;
        --LN$Pos := 0;
     
        --LN$Pos := INSTR( translate(p_chaine,'1 ','1'), ':EUR'); 
     
        x_length:=length(p_chaine);
     
        FOR i IN 1..x_length LOOP
         BEGIN
     
            SELECT SUBSTR( p_chaine,i,1) INTO v_char  FROM dual;
     
            SELECT TO_NUMBER(SUBSTR( p_chaine,i,1)) INTO v_numb FROM dual;
     
     
                IF ( (sql%found) or (v_char = '.') )THEN
                   temp := 1;
     
                   res := res || v_char;
                end IF;
     
                IF sql%notfound and temp = 1 then
                    return res;
                end if;
     
     
         exception
           when invalid_number then NULL;
         end;
     
        end loop;
        --return res;
        end get_position;
    je fais un test avec la chaine suivante :
    "MONTANTS à payer Brut EUR 2460.11111 avec Credit d'impot:0 "
    Mais le resultat retourné est 2 au lieu de 2460.11111.

    Merci pr votre aide!

  5. #5
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 284
    Par défaut
    Oups, j'ai oublié le return à la fin (pl copier/coller)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     end loop;
        return res;
        end get_position

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

Discussions similaires

  1. Extraction d'une sous-chaine de caractère
    Par ninsekh dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 22/04/2008, 08h13
  2. [Bash] : extraction d'une sous chaine
    Par julio_097 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 14/08/2007, 19h33
  3. Extraction d'une sous-chaine à partir d'une chaine principale
    Par gazere dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 13/06/2007, 04h08
  4. Extraction d'une sous-chaine
    Par adurand dans le forum Linux
    Réponses: 2
    Dernier message: 17/03/2007, 17h35
  5. [RegEx] extraction d'une sous chaine
    Par zulkifli dans le forum Langage
    Réponses: 2
    Dernier message: 24/03/2006, 13h27

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