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 :

Procedure pour dupliquer une ligne


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 22
    Points
    22
    Par défaut Procedure pour dupliquer une ligne
    Bonjour,

    jai 2 tables :
    - Personnes : où il y a mes données.
    - Tampon : vide

    Personnes (Nom,Prenom,Adresse,Groupe)
    Tampon(TNom,TPrenom,TAdresse,TGroupe)

    le champs Personnes.Groupe est un VARCHAR2, il peut avoir comme valeur (A; AB;ABC; ABCD etc...)

    Le but est de copier le contenu de personnes dans Tampon et quand Groupe à n lettres, dupliquer la ligne n fois dans Tampon.

    Exemples :
    on a dans personnes
    Martin toto 15 rue du four ABC
    Dupond titi 28 av des fleurs C

    on veut dans Tampon
    Martin toto 15 rue du four A
    Martin toto 15 rue du four B
    Martin toto 15 rue du four C
    Dupond titi 28 av des fleurs C

    jai fais la procedure PL/SQL suivante
    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
    CREATE OR REPLACE PROCEDURE Dupliquer_lignes IS
    CURSOR CCur IS
    	SELECT a.Nom,a.Prenom,a.Adresse,a.Groupe FROM Personnes a;
    ligne Personnes%ROWTYPE;
    n Personnes.Nom%TYPE;
    p Personnes.Prenom%TYPE;
    adr Personnes.Adresse%TYPE;
    g Personnes.Groupe%TYPE;
    i NUMBER;
    BEGIN
    	i:=1;
    	OPEN  CCur;
    	LOOP;
    		FETCH CCur INTO n,p,adr,g;
    		EXIT WHEN CCur%NOTFOUND;
    		IF substr(trim(a.Groupe))>1 THEN
    			FOR i IN 1 .. substr(trim(a.Groupe))
    			LOOP;
    				INSERT INTO Tampon VALUES(n,p,adr,g);
    				i:=i+1;
    			END LOOP;
    		ELSE
    				INSERT INTO Tampon VALUES(n,p,adr,g);
    		END IF;
    	END LOOP;
    	CLOSE CCur;
    END;
     
    /
    Mes Problèmes :

    1 - Il y a une erreur de syntaxe que je ne trouve pas
    2 - Je ne sais pas comment ecrire "quand on duplique, on prend la 1er Groupe, puis le 2nd etc...
    3 - Avez-vous une solution plus simple.

    Merci

  2. #2
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    1) l'erreur est dans le substr
    2) Tu mélanges LE PL/SQL et le VB
    3) Il y a une boucle beaucoup plus simple en PL

    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
    CREATE OR REPLACE PROCEDURE Dupliquer_lignes IS
    CURSOR CCur
    IS
      SELECT   a.Nom,
               a.Prenom,
               a.Adresse,
               a.Groupe
        FROM   Personnes a;
    ligne   ccur%ROWTYPE;
    BEGIN
    FOR ligne IN CCur
    LOOP
       FOR i IN 1 .. LENGTH (ligne.Groupe)
         LOOP
            INSERT INTO Tampon
              VALUES   (ligne.Nom,
                        ligne.Prenom,
                        ligne.Adresse,
                        SUBSTR (ligne.Groupe, i, 1));
         END LOOP;
    END LOOP;
    COMMIT;
    END;
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  3. #3
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Nul besoin d'un procédure compliquée. En fait vous avez besoin d'une requête pivot pour multiplier les enregistrements comme dans l'exemple
    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
     
    SQL> r
      1  With data as
      2  (
      3    Select 'Martin' nom, 'toto' prenom, '15 rue du four' adresse, 'ABC' Groupe from dual union all
      4    Select 'Dupond' nom, 'titi' prenom, '28 av des fleurs' adresse, 'C' Groupe From dual
      5  ), pivot as
      6  (
      7    Select level row_num from dual connect by level <= 10
      8  )
      9  Select nom, prenom, adresse, groupe
     10    From (
     11           Select nom, prenom, adresse, substr(groupe, row_num,1) groupe
     12             From data,
     13                  pivot
     14         )
     15* Where groupe is not null
     
    NOM    PREN ADRESSE          G
    ------ ---- ---------------- -
    Martin toto 15 rue du four   A
    Dupond titi 28 av des fleurs C
    Martin toto 15 rue du four   B
    Martin toto 15 rue du four   C
    et ensuite il reste seulement de faire un simple insert into tampon select ... from...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 22
    Points
    22
    Par défaut
    Merci, en fait je me suis aperçu de mon erreur et j'ai fais la meme chose que garuda.

    par contre je ne connaissais pas les pivot

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

Discussions similaires

  1. Comment faire pour ajouter une ligne seulement !
    Par Fredri dans le forum Access
    Réponses: 1
    Dernier message: 26/12/2005, 12h44
  2. [VBA-E] [help]macro pour dupliquer une feuille (en valeur)
    Par minikisskool dans le forum Macros et VBA Excel
    Réponses: 31
    Dernier message: 07/11/2005, 20h24
  3. Réponses: 4
    Dernier message: 24/09/2005, 10h52
  4. Comment faire pour modifier une ligne dans une DBGrid?
    Par Nico62 dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2005, 13h24
  5. Réponses: 2
    Dernier message: 08/08/2003, 18h30

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