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 :

cursor + truncate +insert


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Points : 14
    Points
    14
    Par défaut cursor + truncate +insert
    bonjour tout le monde ;

    j'ai une table dont je voulait faire un filtrage des donnée j'explique :
    1-je fais appel a la fonction truncate,
    2 -insertion des donnée voulu dans la meme table ,
    tt ca est dans la meme bloc plslq.

    le problème est que je me trouve avec une table vide après l'exécution de bloc.

    voici mon 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
    CREATE OR REPLACE PROCEDURE filters
     IS
       CURSOR filter_cur
       IS
          SELECT   idtier, MAX (referencepiece), MAX (datedelivrance),
                   MAX (dateexpiration), MAX (naturepiece), MAX (paysdelivrance),
                   MAX (nompersonne), MAX (prenompersonne), MAX (datenaissance),
                   MAX (paysnaisance), MAX (sigle), MAX (datecreation),
                   MAX (raisonsociale), MAX (activiteprincipale),
                   MAX (profession), MAX (addc), MAX (categoeirsp),
                   MAX (tranche), MAX (addp), MAX (nationnalite),
                   MAX (residence)
              FROM nfiabilisation
    		  GROUP BY idtier;
     
       filter_rec   nfiabilisation%ROWTYPE;
     
    BEGIN
     
     
       EXECUTE  IMMEDIATE 'truncate  table nfiabilisation reuse storage ';
     
       OPEN filter_cur;
       LOOP 
          FETCH filter_cur
           INTO filter_rec;
         EXIT WHEN filter_cur%NOTFOUND;
          --------
          INSERT INTO nfiabilisation VALUES filter_rec;
     
       END LOOP;
     
       CLOSE filter_cur;
     
       COMMIT;
    EXCEPTION
       WHEN NO_DATA_FOUND
       THEN
          raise_application_error (-20992, 'no data found') ;
    END filters;
    /

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Que fait la fonction TRUNCATE selon vous ?

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Points : 14
    Points
    14
    Par défaut reponse
    eben, elle vide la table nfiabilisation dans ce contexte.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Donc en reprenant votre code, qu'y a-t-il dans la table lorsque vous ouvrez votre curseur ?

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    l'ensemble des champs sélectionnés

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par karimoos Voir le message
    l'ensemble des champs sélectionnés
    Après le truncate ?

  7. #7
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Points : 6 446
    Points
    6 446
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Il faudrait ouvrir le curseur avant le truncate pour lire les données d'avant le truncate.
    Mais malheureusement ça ne marchera pas parce que le truncate va rendre invalides les données qui sont lues (car le truncate change le data_object_id afin justement de ne pas mélanger les anciennes et les nouvelles). avec un delete ca marcherait (car il utilise l'undo), avec un drop table aussi (tant que l'espace libéré n'est pas réécrit) pas pas avec le truncate.

    Il faudrait insérer dans une deuxième table, puis supprimer la première et renommer la deuxième.

    Cordialement,
    Franck.

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par pachot Voir le message
    Bonjour,

    Il faudrait ouvrir le curseur avant le truncate pour lire les données d'avant le truncate.
    Mais malheureusement ça ne marchera pas parce que le truncate va rendre invalides les données qui sont lues (car le truncate change le data_object_id afin justement de ne pas mélanger les anciennes et les nouvelles). avec un delete ca marcherait (car il utilise l'undo), avec un drop table aussi (tant que l'espace libéré n'est pas réécrit) pas pas avec le truncate.

    Il faudrait insérer dans une deuxième table, puis supprimer la première et renommer la deuxième.

    Cordialement,
    Franck.

    justement ce que ta dit c parce que le truncate vide même le cursor après son exécution,bon afin de résoudre ce problème j'ai travaillé avec delete mais a condition qu'elle soit a l'intérieur de fetch.sinon on revient au meme problème précèdent.
    voici le code corriger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    OPEN filter_cur;
       loop
     
          FETCH filter_cur
           INTO filter_rec
    	    EXIT WHEN filter_cur%NOTFOUND;
     
     
    	  DELETE FROM nfiabilisation WHERE IDTIER=filter_rec.v_IDTIER; 
    	  commit;
          INSERT INTO nfiabilisation values filter_rec ;
    close    filter_cur;
    Merci a vous!!!!

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/08/2012, 09h34
  2. "Data truncated" lors d'une insertion d'entrée
    Par doubiste_59 dans le forum Débuter
    Réponses: 3
    Dernier message: 15/07/2010, 18h47
  3. Comment faire un truncate/ insert conditionné
    Par Fiona08 dans le forum SQL
    Réponses: 7
    Dernier message: 18/05/2009, 20h51
  4. SQL Server 2005 :probleme avec truncate et insert
    Par blaise4714 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 20/03/2009, 16h11
  5. Cursor & Insert
    Par bilb0t dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 08/01/2008, 21h38

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