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 :

Scinder un champ dont le texte est délimité par un séparateur et réaffecter ses valeurs à la clé primaire [11g]


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 126
    Par défaut Scinder un champ dont le texte est délimité par un séparateur et réaffecter ses valeurs à la clé primaire
    Bonjour à tous,

    Je cherche à faire quelque chose qui à priori a déjà été demandé, mais mes recherches et quelques tests sont tout de même restés infructueux, donc je cherche de nouvelles pistes pour me creuser les méninges

    je souhaiterai passer d'une table qui se présente comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    ID	STOP_IDS
    1279	StopPoint:4:51,StopPoint:4:47,StopPoint:4:77,StopPoint:4:74,StopPoint:4:84,StopPoint:4:82,StopPoint:4:76
    2729	StopPoint:4:55,StopPoint:4:40,StopPoint:4:32,StopPoint:4:34
    à une table qui se présenterait comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ID	STOP_IDS
    1279	StopPoint:4:51
    1279	StopPoint:4:47
    1279	StopPoint:4:77
    1279	StopPoint:4:74
    1279	StopPoint:4:84
    1279	StopPoint:4:82
    1279	StopPoint:4:76
    2729	StopPoint:4:55
    2729	StopPoint:4:40
    2729	StopPoint:4:32
    2729	StopPoint:4:34

    J'ai trouvé une discussion qui correspond tout à fait à ce que je cherche à faire etj e m'en suis inspirée pour essayer d'utiliser les fonctionnalités de PIPELINED, mais je ne maîtrise pas et j'ai du mal à comprendre l'exemple donné pour l'adapter


    Je suis preneuse de toutes suggestions ou pistes, ou autres discussions sur le sujet à côté desquelles je serai passée!

    Je vous remercie par avance de l'aide que vous pourrez m'apporter

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    C'est possible en SQL directement, avec le XML, ça dépend un peu des donné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
    18
    WITH W AS (SELECT 1279	ID, 'StopPoint:4:51,StopPoint:4:47,StopPoint:4:77,StopPoint:4:74,StopPoint:4:84,StopPoint:4:82,StopPoint:4:76' stop_ids FROM dual
    UNION ALL SELECT 2729	, 'StopPoint:4:55,StopPoint:4:40,StopPoint:4:32,StopPoint:4:34' FROM dual
    )
    SELECT w.ID, EXTRACTVALUE(COLUMN_VALUE,'e')
    FROM w, TABLE(XMLSEQUENCE(XMLTYPE('<e><e>' || REPLACE(w.stop_ids,',','</e><e>') || '</e></e>').EXTRACT('e/*')))
     
    ID	EXTRACTVALUE(COLUMN_VALUE,'E')
    1279	StopPoint:4:51
    1279	StopPoint:4:47
    1279	StopPoint:4:77
    1279	StopPoint:4:74
    1279	StopPoint:4:84
    1279	StopPoint:4:82
    1279	StopPoint:4:76
    2729	StopPoint:4:55
    2729	StopPoint:4:40
    2729	StopPoint:4:32
    2729	StopPoint:4:34

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

    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
    Billets dans le blog
    4
    Par défaut
    Tant qu'on y est, autant donner l'autre méthode en plsql avec PIPELINED

    Il faut créer un type en base
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE OR REPLACE TYPE TYP_TAB_CHAINE AS TABLE OF VARCHAR2(200);
    Fonction qui prend une chaine et la découpe suivant les ','
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE OR REPLACE FUNCTION wmcFL (p_data IN VARCHAR2)  
    RETURN  TYP_TAB_CHAINE PIPELINED AS
    	v_chaine VARCHAR2(4000) := p_data;
    BEGIN
    	IF p_data IS NULL THEN RETURN; END IF;
    	v_chaine := v_chaine ||',';
    	WHILE v_chaine IS NOT NULL
      LOOP
      	PIPE ROW(SUBSTR(v_chaine, 1, INSTR(v_chaine, ',')-1)); 
        v_chaine := SUBSTR(v_chaine, INSTR(v_chaine, ',')+1);       
    	END LOOP;
      RETURN;
    END;
    l'appel simple se fait comme celà
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TABLE (wmcfl('123,456,789'));
    Avec ta table de points
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    WITH W AS (SELECT 1279	ID, 'StopPoint:4:51,StopPoint:4:47,StopPoint:4:77,StopPoint:4:74,StopPoint:4:84,StopPoint:4:82,StopPoint:4:76' stop_ids FROM dual
    UNION ALL SELECT 2729	, 'StopPoint:4:55,StopPoint:4:40,StopPoint:4:32,StopPoint:4:34' FROM dual
    )
    SELECT w.ID, j.COLUMN_VALUE
    FROM w, TABLE (wmcfl(w.stop_ids)) j;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ID	COLUMN_VALUE
    1279	StopPoint:4:51
    1279	StopPoint:4:47
    1279	StopPoint:4:77
    1279	StopPoint:4:74
    1279	StopPoint:4:84
    1279	StopPoint:4:82
    1279	StopPoint:4:76
    2729	StopPoint:4:55
    2729	StopPoint:4:40
    2729	StopPoint:4:32
    2729	StopPoint:4:34

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 126
    Par défaut
    Merci beaucoup, je vais exploiter ces 2 pistes et reviens vers vous

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 126
    Par défaut
    C'est vraiment parfait!

    J'arrive au résultat escompté en faisant la requête suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    insert into matable_detail(id_ss_ligne, stop_ids)	
    WITH W AS (SELECT id_ss_ligne, stop_ids FROM matable)
    SELECT w.id_ss_ligne, j.COLUMN_VALUE
    FROM w, TABLE (wmcfl(w.stop_ids)) j;	
     
    commit;
    Un grand merci!!!
    J'aurai appris quelque chose, je comprends un peu mieux l'utilisation de PIPELINED

    Bonne journée,

    Cécile

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 997
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 997
    Billets dans le blog
    6
    Par défaut
    Ou encore de manière récursive :

    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
    with cte_w (id, stop_ids) as
    (
    select 1279, 'StopPoint:4:51,StopPoint:4:47,StopPoint:4:77,StopPoint:4:74,StopPoint:4:84,StopPoint:4:82,StopPoint:4:76'
      from dual
     union all 
    select 2729, 'StopPoint:4:55,StopPoint:4:40,StopPoint:4:32,StopPoint:4:34'
      from dual
    )
      ,  cte_x (id, stopid, stop_ids) as
    (
    select id
         , substr(stop_ids, 1, instr(stop_ids, ',') - 1)
         , substr(stop_ids, instr(stop_ids, ',') + 1, length(stop_ids) - instr(stop_ids, ','))
      from cte_w
     union all
    select id
         , substr(stop_ids, 1, instr(stop_ids, ',') - 1)
         , substr(stop_ids, instr(stop_ids, ',') + 1, length(stop_ids) - instr(stop_ids, ','))
      from cte_x
     where instr(stop_ids, ',') > 0
    )
    select id, stopid
      from cte_x
     union all
    select id, stop_ids
      from cte_x
     where instr(stop_ids, ',') = 0;
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 16/09/2008, 19h08
  2. Réponses: 1
    Dernier message: 28/05/2007, 18h23
  3. Bouton dont le texte est barré
    Par xenos dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 27/11/2006, 20h15
  4. Réponses: 3
    Dernier message: 09/01/2006, 16h19
  5. Réponses: 2
    Dernier message: 21/09/2005, 13h35

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