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 :

Pl/Sql , 8i , découpage de chaine de caractères


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 13
    Par défaut Pl/Sql , 8i , découpage de chaine de caractères
    Bonjour à tous,

    Je voudrai découper une chaine de caractères (du type '123|456|789') en PL/SQL afin de traiter chaque élément 1 par 1 (123 puis 456 puis 789). Sachant que les éléments sont de longueur variable et sont de type numérique (donc impossible d'utiliser "dbms_utility.comma_to_table").

    Si quelqu'un a une idée, je suis preneur.

    Merci d'avance,

    Youby

  2. #2
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Vous pouvez utiliser la fonction suivante qui accepte n'importe quel séparateur

    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
    CREATE OR REPLACE FUNCTION Split ( PC$Chaine IN VARCHAR2, PN$Pos IN PLS_INTEGER, PC$Sep IN VARCHAR2 DEFAULT ',' )
    RETURN VARCHAR2
    IS
     LC$Chaine VARCHAR2(32767) := PC$Sep || PC$Chaine ;
     LI$I  PLS_INTEGER ;
     LI$I2 PLS_INTEGER ;
    BEGIN
     LI$I := INSTR( LC$Chaine, PC$Sep, 1, PN$Pos ) ;
     IF LI$I > 0 THEN
        LI$I2 := INSTR( LC$Chaine, PC$Sep, 1, PN$Pos + 1) ;
    	IF LI$I2 = 0 THEN LI$I2 := LENGTH( LC$Chaine ) + 1 ; END IF ;
    	RETURN( SUBSTR( LC$Chaine, LI$I+1, LI$I2 - LI$I-1 ) ) ;
     ELSE
        RETURN NULL ;
     END IF ;
    END;
    /

  3. #3
    CD
    CD est déconnecté
    Membre éprouvé
    Inscrit en
    Septembre 2004
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 127
    Par défaut
    Sinon, il y a un exemple ici aussi :

    http://asktom.oracle.com/pls/ask/f?p...14787726678630

  4. #4
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 13
    Par défaut
    Merci pour vos réponses, j'ai trouvé mon bonheur.

    A bientot

    Youby

  5. #5
    Membre éclairé Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Par défaut
    Bonjour,

    après avoir posé une question ici, j'ai atteri sur ce topic.

    Merci pour la fonction mais je me permet de rajouter quelques commentaires car je n'ai pas tout piger du premier coup.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sur la fonction SPLIT, le premier argument PC$Chaine est donc la chaîne de caractère (ex: 123-456-789), le deuxième argument PN$Pos la position de la partie souhaitée (ex : 1 donnera 123, 2 donnera 456, et 3 donnera 789), le troisème argument PC$Sep le séparateur.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 94
    Par défaut
    Boujour,

    Question bête, je débute, : comment fait-on pour utiliser cette fonctions ?

    Je vous pose mon problème, cela me permttra de savoir si cette fonction (modifiée) est adapté à mon problème.

    J'ai une table 'table' avec deux champs 'id' et 'num' qui contient des chaines du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    create table test (id number, num varchar2(255));
    insert into table test (1,'12,12345, A345, TOTO');
    insert into table test (2,'454');
    insert into table test (3,'13,454');
    Je veux comme résultat final dans une autre table 'result' avec comme pour sequence, l'ordre d'afichage des valeurs de num pour chaque id

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    create table result (id number, num varchar2(255), sequence number);
    id, num, sequence
    1 12     1
    1 12345  2
    1 A345   3
    1 TOTO   4
    2 454    1
    3 13     1
    3 454    2
    Est-ce jouable en SQL seul ou faut-il du PL/SQL

    La deuxième partie du pb consiste à ne pas inserer certaines valeurs. Par exemple comment créer une liste de valeur qui ne doivent pas être inséré dans la table : par exemple si je ne veux pas intégrer les valeurs 12 et 13 voici ce que je voudrais obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    id, num, sequence
    1 12345  1
    1 A345   2
    1 TOTO   3
    2 454    1
    3 454    1
    Il ya une troisième partie mais je vais m'arrêter ici.

    Merci pour votre aide

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

Discussions similaires

  1. [SQL-Server] SQL Server: convertir une chaine de caractères en date
    Par Louisa2005 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 16/09/2013, 10h25
  2. Découpage de chaine de caractères
    Par fabpeden dans le forum C
    Réponses: 3
    Dernier message: 07/05/2007, 11h50
  3. [TRANSACT SQL] longueur d'une chaine de caractères
    Par Cyborg289 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/03/2007, 08h06
  4. [PL/SQL] interprétation d'une chaine de caractère
    Par bj_jet dans le forum Oracle
    Réponses: 7
    Dernier message: 29/01/2006, 21h57
  5. Découpage de chaine de caractère
    Par tcharles dans le forum C++
    Réponses: 11
    Dernier message: 23/08/2004, 14h34

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