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

SQL Oracle Discussion :

Test insert delete


Sujet :

SQL Oracle

  1. #41
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 29
    Par défaut Test insert delete
    Franchement je n'ai rien compris

    Moi je veux faire une suppression apres une insertion, avec la condition que la ligne ne doit pas etre supprimé si elle n'a été pas inserée et inversement,
    sans utiliser de trigger parce que je suis limité par un code existant

  2. #42
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 29
    Par défaut Test insert delete
    Le skip locked
    prend les enregistrements libres et les bloque en meme temps

  3. #43
    Expert confirmé 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
    Par défaut
    Citation Envoyé par zico_pro Voir le message
    Le skip locked
    prend les enregistrements libres et les bloque en meme temps
    Donne moi le lien de la documentation d'ORACLE qui explique SKIP LOCK
    J'attends.

  4. #44
    Expert confirmé 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
    Par défaut
    Citation Envoyé par zico_pro Voir le message
    Franchement je n'ai rien compris

    Moi je veux faire une suppression apres une insertion, avec la condition que la ligne ne doit pas etre supprimé si elle n'a été pas inserée et inversement,
    sans utiliser de trigger parce que je suis limité par un code existant
    Tu veux archiver (= insérer dans une table historique et supprimer de ta table) une partie d’une table T. Pour cella la transaction est (comme je te l'ai déjà dit)
    • Verrouillage de données à archiver
    • Insertion dans la table historique
    • Suppression dans la table T
    • Commit

    Voilà.

  5. #45
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    pour info, voila comment devrait être géré le skip locked selon le support : HOW TO SELECT FROM A TABLE EXCLUDING LOCKED ROWS

    Preuve que SKIP LOCKED est à proscrire : Bug 4417341 - SKIP LOCKED mishandles fetch out of sequence errors

    Il est buggé et c'est ça qui provoque l'ORA-600

  6. #46
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Donne moi le lien de la documentation d'ORACLE qui explique SKIP LOCK
    J'attends.
    En 11g mais seulement en 11g, l'option SKIP LOCK est documentée dans le SQL Reference:

    SKIP LOCKED
    SKIP LOCKED is an alternative way to handle a contending transaction that is locking some rows of interest. Specify SKIP LOCKED to instruct the database to attempt to lock the rows specified by the WHERE clause and to skip any rows that are found to be already locked. This feature is useful if the goal of the query is to obtain numbers of units, rather than the actual content of the rows.

    Note on the WAIT and SKIP LOCKED Clauses
    If you specify WAIT or SKIP LOCKED and the table is locked in exclusive mode, then the database will not return the results of the SELECT statement until the lock on the table is released. In the case of WAIT, the SELECT FOR UPDATE clause is blocked regardless of the wait time specified.

  7. #47
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 29
    Par défaut Test insert delete
    Voilà 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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    DECLARE
     
     CURSOR  C1 IS
     		  SELECT SC.ROWID FROM tab_orig
              WHERE 
              ...
              for update skip locked;
     
    TYPE TAB_UROWID IS TABLE OF UROWID INDEX BY BINARY_INTEGER;
     
    l_rowid TAB_UROWID;		  
    nbdel number;
     
     
    BEGIN
    	nbdel := 0;
     
    	OPEN  C1;
     
      loop        
    		fetch C1 BULK COLLECT into l_rowid LIMIT 1000;
       		if  (l_rowid.COUNT != 0) then
     
    			for j in 1..l_rowid.COUNT loop
     
                                          begin
     
                                          insert into tab_archiv
                                                 (select ..
                                                 from te_orig where rowid = l_rowid(j)
                                                 );
     
                                          delete from tab_orig where rowid = l_rowid(j);
     
                                          nbdel := nbdel + 1;
     
                                          exception
                                           when others then
                                           NULL;
                                           end;
     
                                          end loop;
     
     
     
                                end if;
      exit when C1%NOTFOUND;
      end loop;
      commit;
      	CLOSE  C1;
     
    EXCEPTION
     
    		WHEN OTHERS THEN
       		CLOSE  C_stocouch;
     
    END;
    Est ce code est juste?
    Est ce que le test pour la ligne inserée et supprimée se fait comme ça?

    Il est sensé recupérer (par le curseur ) les lignes à supprimer en prenant que les lignes non bloquées et le bloquant penant son traitement, ensuite traiter les lignes par lot de 1000. Pour chaque lot, inserer la ligne dans la table tab_archiv et la supprimer de la table d'origine (tout en respectant l'hypothèse que la ligne n'est supprimé de la table d'origine que si elle a été bien inseré dans la table d'archivage et inversement)

    Merci par avance

  8. #48
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut


    Citation Envoyé par zico_pro Voir le message
    Est ce code est juste?
    Est-ce qu'on n'a pas déjà dit que SKIP LOCKED était périlleux ? Est-ce que tu n'as pas une ORA-600 avec ce code ?

  9. #49
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 29
    Par défaut Test insert delete
    Non, en mettant le commit après la boucle du fetch (après avoir traiter tout les enregistrements) je n'ai pas ce message d'erreur

  10. #50
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    enfin dans ton code je ne vois pas ce qui empêche de faire le DELETE si l'INSERT est KO

  11. #51
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 29
    Par défaut Test insert delete
    Mais l'exception là (où j ai mis null) ça suffit pas?

  12. #52
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    si c'est le DELETE qui plante tu insèreras plusieurs fois la même ligne.

    Mais il y a mieux à faire :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    CREATE OR REPLACE PROCEDURE archive_lines IS
     CURSOR  C1 IS
     		  SELECT SC.ROWID FROM tab_orig
              WHERE 
              ...
              FOR UPDATE skip locked;
     
    TYPE TAB_UROWID IS TABLE OF UROWID INDEX BY BINARY_INTEGER;
     
    l_rowid TAB_UROWID;		  
    nbdel number;
     
     
    BEGIN
    	nbdel := 0;
     
    	OPEN  C1;
     
      loop        
    		fetch C1 BULK COLLECT INTO l_rowid LIMIT 1000;
       		IF  (l_rowid.COUNT != 0) then
     
    			FOR j IN 1..l_rowid.COUNT loop
     
                                          begin
                                          INSERT INTO tab_archiv
                                                 (SELECT ..
                                                 FROM te_orig WHERE rowid = l_rowid(j)
                                                 );
                                          exception
                                           when others then
                                           NULL;
                                           end;
     
                                          end loop;
     
     
     
                                end IF;
      exit when C1%NOTFOUND;
      end loop;
      commit;
      	CLOSE  C1;
     
    EXCEPTION
     
    		WHEN OTHERS THEN
       		CLOSE  C_stocouch;
     
    END;
    Et ensuite, tu peux lancer autant de fois que tu veux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    EXEC archive_lines;
    DELETE FROM tab_orig WHERE pk IN (SELECT pk from tab_archiv);
    Tu archives ce qui doit être supprimé et tu supprimes ce qui est archivé. Note que je passe par la PK plutôt que le ROWID pour faire le DELETE.

  13. #53
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 29
    Par défaut Test insert delete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    EXEC archive_lines;
    DELETE FROM tab_orig WHERE pk IN (SELECT pk FROM tab_archiv);

    Merci bien de m'avoir repondu

    Mais ce code je le mais apres la fermeture du curseur C1
    En plus c'est quoi archive_lines

  14. #54
    Expert confirmé 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
    Par défaut
    Citation Envoyé par pifor Voir le message
    En 11g mais seulement en 11g, l'option SKIP LOCK est documentée dans le SQL Reference:
    Merci pifor, c'est noté!

  15. #55
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    archive_lines c'est la procédure que je crée en lieu et place de ton code

    relis ma réponse et réfléchis à ce que ça fait. Si le DELETE tu le fais après la fermeture de C1, j'vois pas bien l'intérêt de le faire aussi dans la boucle

  16. #56
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 29
    Par défaut Test insert delete
    Merci bien
    Je pense que c'est bon
    Merci

  17. #57
    Expert confirmé 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
    Par défaut
    Jolie solution de type usine à gaz !

    Citation Envoyé par zico_pro Voir le message
    Merci bien
    Je pense que c'est bon
    Merci
    Vous plaisantes, c'est certes!

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. ADO.NET INSERT DELETE UPDATE refresh des composants graphic
    Par jeriko dans le forum Accès aux données
    Réponses: 5
    Dernier message: 15/01/2007, 15h17
  2. [JUnit] Test insertion dans DB
    Par MicroPuce dans le forum Tests et Performance
    Réponses: 6
    Dernier message: 11/11/2006, 11h22
  3. [ODBC] Faire une requête INSERT, DELETE, UPDATE
    Par avogadro dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 21/09/2006, 11h35
  4. événement sur INSERT, DELETE, UPDATE
    Par papouAlain dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/12/2004, 15h40
  5. Evenement sur UPDATE, INSERT, DELETE
    Par papouAlain dans le forum Langage SQL
    Réponses: 6
    Dernier message: 23/12/2004, 14h58

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