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 :

récuperation des chaines de caractère


Sujet :

PL/SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Février 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 27
    Par défaut récuperation des chaines de caractère
    Bonjour,

    Je débute sur pl/sql.
    Ma base possède une table dont un des champs se nomme 'adresse'.Dans cette 'adresse' ,
    la boite postale y est inclus . ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     117 rue Colbert BP 400 Birman
    Donc ,pour récupérer la boite postale ,ici 'BP 400'
    J'ai ajouté un champ 'BP' dans laquelle je dois mettre les boites postales récupéré dans le champ 'adresse'.
    Pour la methode de recuperation, j'ai essayé avec la fonction sbstr
    mais je n'arrive pas .

    quelqu'un peut m'aider?
    merci!

  2. #2
    Invité
    Invité(e)
    Par défaut
    Il faut jouer avec les fonctions chaînes de caractères :
    http://sheikyerbouti.developpez.com/...age=Chap3#L3.1

  3. #3
    Membre expérimenté Avatar de mongilotti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2003
    Messages : 314
    Par défaut
    tu fais POS:=INSTR(ADRESSE,'BP'), ça te retourne la position de la lettre 'B' de 'BP', ensuite tu fais champ_BP = SUBSTR(ADRESSE,POS+3,3) pour avoir la boite postal sur 3 position.

  4. #4
    Membre averti
    Inscrit en
    Février 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 27
    Par défaut
    Merci pour les réponses et les idées.
    Je vais m'efforcer d'atteindre mon but

  5. #5
    Membre averti
    Inscrit en
    Février 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 27
    Par défaut
    Excusez-moi, j'ai un ptit probleme sur la fonction INSTR
    parcequ'il est possible d'avoir un enregistrement comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    117 rue Colbert B.P 400 Birman
    Il n'est pas possible d'ecrire une instruction du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSTR(ADRESSE,'BP' or 'B.P')
    que dois-je faire
    merci!

  6. #6
    Membre expérimenté Avatar de mongilotti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2003
    Messages : 314
    Par défaut
    tu peux faire :
    POS := INSTR(ADRESSE,'BP');
    IF POS = 0 THEN
    POS := INSTR(ADRESSE,'B.P');
    END IF;

    c'est tout.

  7. #7
    Membre averti
    Inscrit en
    Février 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 27
    Par défaut
    En jetant un coup d'œil sur le lien du doc concerant le traitement des chaines et avec l'aide de mr mongilotti; j'ai essayé ceci.
    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
     
    DECLARE 
    POS number;
    cursor X is select instr(adresse,'BP') from essai WHERE ADRESSE LIKE '%BP%';
    cursor Z is select instr(adresse,'B.P') from essai WHERE ADRESSE LIKE '%B.P%';
    BEGIN
    OPEN X;
    	LOOP
    		FETCH X INTO POS;
    		EXIT WHEN (X%NOTFOUND);
    		UPDATE ESSAI SET BP=SUBSTR(ADRESSE,POS,6);	
    	END LOOP;
    CLOSE X;
    OPEN Z;
    	LOOP
    		FETCH Z INTO POS;
    		EXIT WHEN (Z%NOTFOUND);
    		UPDATE ESSAI SET BP=SUBSTR(ADRESSE,POS,6);	
    	END LOOP;
    CLOSE Z;
    END;
    mais si BP ou B.P se trouve au début ou à la fin , comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BP 400 rue Romain Paris
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    15 rue Romain Paris B.P 400
    le procedure ne detecte pas BP

    merci

  8. #8
    Membre expérimenté Avatar de mongilotti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2003
    Messages : 314
    Par défaut
    pourquoi faire des curseurs !!!!!!
    il suffit de faire ça: (tu es sur la ligne courante bien sur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      DECLARE
        POS NUMBER:=0;
      BEGIN
        POS := INSTR(:ADRESSE,'BP');
        IF POS = 0 THEN
           POS := INSTR(:ADRESSE,'B.P');
           IF POS <> 0 THEN
               :BOITE_POSTAL := SUBSTR(:ADRESSE,POS+3,3);
           END IF;     
        ELSE
          :BOITE_POSTAL := SUBSTR(:ADRESSE,POS+2,3);
        END IF;

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Par défaut
    il y a encore plus simple
    il suffit simplement de faire une requete sql

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    update adr
    set bp = case
             when instr(adresse,'BP') != 0
             THEN SUBSTR(adresse, instr(adresse,'BP'), (instr(adresse, ' ', instr(adresse,'BP'),2) - instr(adresse,'BP')))
             when instr(adresse,'B.P') != 0
             THEN SUBSTR(adresse, instr(adresse,'B.P'), (instr(adresse, ' ', instr(adresse,'B.P'),2) - instr(adresse,'B.P')))
             end;

  10. #10
    Membre averti
    Inscrit en
    Février 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 27
    Par défaut
    des questions:
    :BOITE_POSTAL et:ADRESSE sont des variables.-Comment dois-je les déclarer ?
    -Est-ce que j'ai pas vraiment besoin d'utiliser un CURSEUR pour parcourir toutes les lignes du tables ESSAI? et comment doit-on mettre à jour le champ BOITE_POSTAL?
    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
     
    DECLARE
        POS NUMBER:=0;
        VAR_ADR ESSAI.ADRESSE%TYPE;
        VAR_BP ESSAI.BP%TYPE;
    BEGIN
        POS := INSTR(VAR_ADR,'BP');
        IF POS = 0 THEN
           POS := INSTR(VAR_ADR,'B.P');
           IF POS <> 0 THEN
               --VAR_BP := SUBSTR(VAR_ADR,POS+3,3);
               UPDATE ESSAI SET BP=SUBSTR(VAR_ADR,POS+3,3);
           END IF;     
        ELSE
          --VAR_BP := SUBSTR(VAR_ADR,POS+2,3);
          UPDATE ESSAI SET BP=SUBSTR(VAR_ADR,POS+2,3);
        END IF; 
    END;

    merci

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Par défaut
    ce ne sont pas des variables
    j'ai juste créé une table adr qui doit correspondre a ta problematique

    create table adr (adresse varchar2(100), bp varchar2(10))

    l'exemple que j'ai donné, permet de mettre a jour toutes les lignes de la table adr

    voila ce que fait ma requete:
    elle recupere une chaine de caractere a partir de la position de la chaine BP ou B.P dans adresse
    ensuite je cherche la position du deuzieme espace a partir de la position de la chaine BP ou B.P dans adresse a laquelle je soustrait la position de la chaine BP ou B.P dans adresse afin d'avoir le nombre de caractere a extraire

    exemple:
    si on a la chaine suivante dans adresse :
    117 rue Colbert BP 400 Birman
    j'obtiendrai dans la chanp bp:
    BP 400

  12. #12
    Membre averti
    Inscrit en
    Février 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 27
    Par défaut
    ok merci à vous deux, j'ai compris
    mais une dernière chose
    lorsque par ex BP xxx se trouve à la fin.
    ex:
    la requête ne la connait pas

    merci encore

  13. #13
    Membre expérimenté Avatar de mongilotti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2003
    Messages : 314
    Par défaut
    normalement peut n'importe la position de BP, ça marcherais.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Par défaut
    voici ma requete modifé afin de prendre en compte ce cas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    update adr
    set bp = case
             when instr(adresse,'BP') != 0
             THEN SUBSTR(adresse, instr(adresse,'BP'), (CASE 
                                                         WHEN (instr(adresse, ' ', instr(adresse,'BP'),2)) = 0 THEN ((length(adresse) + 1) - instr(adresse,'BP'))
                                                         ELSE (instr(adresse, ' ', instr(adresse,'BP'),2) - instr(adresse,'BP'))
                                                         END ))
             when instr(adresse,'B.P') != 0
             THEN SUBSTR(adresse, instr(adresse,'B.P'), (CASE 
                                                         WHEN (instr(adresse, ' ', instr(adresse,'B.P'),2)) = 0 THEN ((length(adresse) + 1) - instr(adresse,'BP'))
                                                         ELSE (instr(adresse, ' ', instr(adresse,'B.P'),2) - instr(adresse,'B.P'))
                                                         END ))
             end;

  15. #15
    Membre averti
    Inscrit en
    Février 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 27
    Par défaut recupération de chaînes de caractères (suite)
    Bonjour,

    Mille merci pour la requête , elle marche bien.
    Et grâce à vous, je me suis habitué sur l'utilisation des fonctions SUBSTR () et INSTR ().

    Par la suite, j'aimerai exploiter l'utilisation de ces 2 fonctions en utilisant des boucles ou quelque choses du genre.

    Voici deux tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    COMMUNE           
    CODE POSTAL           LIBELLE         
    05460             Abriès                   
    05250             Agnières
    05470             Aiguilles
    05260             Ancelles
    05300             Antonaves
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ADR
    ADRESSE                         Code Postal
    117 RUE AAAA ABRIES                      
    250 BBB Abriès H-A                          
    Ancelles, 115 CCC Rue X                   
    Rue du Port 32, Ancelles France         
    Avenue de la Tranchée Antonaves
    Le but est alors d'alimenter la colonne Code Postal de la table ADR à partir du champ ADRESSE ,en testant chaque mot dans ce dernier par ceux trouvant dans la table COMMUNE.LIBELLE.
    Si égale on met à jour la colonne Code Postal par Code Postal dans la table ADR.

    J'ai essayé tout d'abord d'extraire chaque mot de ADRESSE et je veux les comparer avec LIBELLE de la table ADR.

    comment utiliser une boucle pour la requête suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    --1er mot
    select substr('adresse',1,instr('adresse',' ')-0) from dual
    --2nd mot        [chaîne]                [position]                             [nombre à extraire]
    select substr( 'adresse' , instr('adresse',' ',1,1)+1 , instr('adresse',' ',1,2)-instr('adresse',' ',1,1)) from dual;
    --troisième mot
    select substr( 'adresse' , instr('adresse',' ',1,2)+1 , instr('adresse',' ',1,3)-instr('adresse',' ',1,2)) from dual;
    --dernier mot
    select substr( 'adresse' , instr('adresse',' ',1,3)+1 , length('adresse')-instr('adresse',' ',1,3)) from dual;
    et mettre à jour la colonne Code Postal de la table ADR

    Merci

  16. #16
    Membre averti
    Inscrit en
    Février 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 27
    Par défaut
    une petite erreur sur le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    --1er mot
    SELECT substr('adresse',1,instr('adresse',' ')-0) FROM ADR
    --2nd mot        [chaîne]                [position]                             [nombre à extraire]
    SELECT substr( 'adresse' , instr('adresse',' ',1,1)+1 , instr('adresse',' ',1,2)-instr('adresse',' ',1,1)) FROM ADR;
    --troisième mot
    SELECT substr( 'adresse' , instr('adresse',' ',1,2)+1 , instr('adresse',' ',1,3)-instr('adresse',' ',1,2)) FROM ADR;
    --dernier mot
    SELECT substr( 'adresse' , instr('adresse',' ',1,3)+1 , length('adresse')-instr('adresse',' ',1,3)) FROM ADR;
    merci

  17. #17
    Membre expérimenté Avatar de mongilotti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2003
    Messages : 314
    Par défaut
    qu'elle est l'erreur exactement?

  18. #18
    Membre averti
    Inscrit en
    Février 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 27
    Par défaut
    TABLE ADR au lieu de Dual

    merci pour la suite

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Par défaut
    une fois de plus, il n'est pas nécessaire de passer par du PL
    un update suffit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    update adr  a
    set a.code_postal = (select c.code_postal 
                         from commune c
                         where a.adresse like '%'||c.libelle||'%')
    where a.code_postal is null;

  20. #20
    Membre averti
    Inscrit en
    Février 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 27
    Par défaut
    Bon ben , merci beaucoup ; moi je cherche toujours la complication des choses .
    merci encore !!

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

Discussions similaires

  1. Récuperer des chaines de caractére spécifiques
    Par tomenbois dans le forum C++
    Réponses: 0
    Dernier message: 16/04/2008, 16h45
  2. [VBA-E] Récuperer une chaine de caractère dans un fichier pdf
    Par Alex_Kidd dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/07/2006, 15h01
  3. [VB.NET]comment on filtre des chaines de caractères ?
    Par zouhib dans le forum Windows Forms
    Réponses: 61
    Dernier message: 14/06/2006, 14h33
  4. [C++.net]Concatener des chaines de caractère
    Par Dlyan dans le forum MFC
    Réponses: 3
    Dernier message: 27/03/2006, 15h25
  5. Repérer des chaines de caractères formatée dans du texte
    Par jeremiegrenoble dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 01/02/2006, 13h06

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