Précédent   Forum des professionnels en informatique > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/02/2011, 15h38   #1
Invité de passage
 
Inscription : juin 2009
Messages : 11
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 11
Points : 0
Points : 0
Par défaut Requête DELETE + jdbc

Salut tout le monde,

J'ai un petit problème de conception en java mais qui a attrait à une requête DB2.

Dans un fichier .sql, j'ai une requête de la forme
Code :
1
2
 
DELETE FROM MATABLE WHERE ID <> 900 FETCH FIRST 1000 row only
L'utilisation du FETCH est imposée par les DBA pour ne pas exploser les logs.

Mon souci est que je ne sais pas comment supprimer mes lignes en jdbc car il se peut que je n'ai pas plus de 1000 lignes à supprimer ou, au contraire, plus de 1000 lignes à supprimer en mm tps.

Je propose ceci, qu'en pensez-vous?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
int compteurLignesSupp = 0;
String query = "DELETE........";
 try
    {
     Statement st = conn.createStatement();
     st.executeUpdate(query);
 
     compteurLignesSupp =  st.updateCount();
     while (compteurLignesSupp >= 1000)
                 st.executeUpdate(query);
 
    }
    catch (SQLException ex)
    {
      System.err.println(ex.getMessage());
    }
Merci d'avance pour votre aide.

Cordialement,
Hakim93210 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2011, 21h18   #2
Membre Expert

 
Homme François Durand
Spécialiste Delivery Mainframe IBM
Inscription : octobre 2005
Messages : 1 096
Détails du profil
Informations personnelles :
Nom : Homme François Durand
Âge : 53
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : Spécialiste Delivery Mainframe IBM
Secteur : Finance

Informations forums :
Inscription : octobre 2005
Messages : 1 096
Points : 1 704
Points : 1 704
Quel DB2 ?
Luc Orient est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2011, 21h45   #3
Invité de passage
 
Inscription : juin 2009
Messages : 11
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 11
Points : 0
Points : 0
Par défaut Re

Salut,

Il me semble que c une DB2 V7.
Hakim93210 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2011, 22h01   #4
Membre Expert

 
Homme François Durand
Spécialiste Delivery Mainframe IBM
Inscription : octobre 2005
Messages : 1 096
Détails du profil
Informations personnelles :
Nom : Homme François Durand
Âge : 53
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : Spécialiste Delivery Mainframe IBM
Secteur : Finance

Informations forums :
Inscription : octobre 2005
Messages : 1 096
Points : 1 704
Points : 1 704
DB2 for z/OS (Mainframe) ?
DB2 for LUW (Linux/Unix/Windows) ?
DB2 for i (AS/400) ?
Luc Orient est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 08h30   #5
Invité régulier
 
Inscription : mai 2007
Messages : 28
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 28
Points : 7
Points : 7
Par défaut Re

Salut,

C'est du DB2 V9.5, sous Windows.

Cordialement,
Karim93210 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 15h02   #6
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
mais votre ordre sql marche ?

Car je ne vois nul part la possibilité de faire un fetch first sur un delete, ce qui parait logique.

http://publib.boulder.ibm.com/infoce...c/r0000939.htm
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 08h08   #7
Invité régulier
 
Inscription : mai 2007
Messages : 28
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 28
Points : 7
Points : 7
Par défaut Re

Bonjour à tous,

Oui mon ordre marche, c'est juste la manipulation depuis mon source Java qui me pose pb.

L'utilisation du FETCH dans le DELETE permet de ne pas faire exploser les logs.
Karim93210 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 12h02   #8
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Mais si votre but c'est de tout supprimer, que vous les supprimiez en une fois ou en n fois ca reviendra au même, vos "log" vont quand même être rempli.

D'ailleurs, pourriez-vous développer un peu cette notion de log ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 07h06   #9
Membre éclairé
 
Benoit Boulc'h
Développeur informatique
Inscription : février 2009
Messages : 240
Détails du profil
Informations personnelles :
Nom : Benoit Boulc'h
Âge : 33

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2009
Messages : 240
Points : 379
Points : 379
Bonjour,

L'utilisation du fetch doit peut être se faire comme ça :

Code :
DELETE FROM (SELECT salary FROM employee ORDER BY salary fetch first 50 rows only)
(requête trouvée sur la page suivante mais non testée : http://it.toolbox.com/blogs/db2luw/i...ll-select-7161).

Mais comme l'a précisé Punkoff, il se peut qu'au final les logs "explosent".

Il faudrait essayer l'option "ACTIVATE NOT LOGGED INITIALLY" de "ALTER TABLE" qui permet de désactiver temporairement les logs sur une table :

http://publib.boulder.ibm.com/infoce...n/r0000888.htm

Benoit
bboulch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 10h42   #10
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Ces logs c'est un équivalant de la journalisation ?

edit :
Citation:
If non-logged activity occurs against a table that has the NOT LOGGED INITIALLY attribute activated, and if a statement fails (causing a rollback), or a ROLLBACK TO SAVEPOINT is executed, the entire unit of work is rolled back (SQL1476N). Furthermore, the table for which the NOT LOGGED INITIALLY attribute was activated is marked inaccessible after the rollback has occurred and can only be dropped. Therefore, the opportunity for errors within the unit of work in which the NOT LOGGED INITIALLY attribute is activated should be minimized.
C'est violant comme solution
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 11h46   #11
Membre éclairé
 
Benoit Boulc'h
Développeur informatique
Inscription : février 2009
Messages : 240
Détails du profil
Informations personnelles :
Nom : Benoit Boulc'h
Âge : 33

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2009
Messages : 240
Points : 379
Points : 379
Merci, je cherchais le terme correct ce matin.

Oui, il s'agit bien de la journalisation. C'est un problème ponctuel (de vidage de table) que j'ai rencontré il y a quelques années et cette solution convenait bien.

Effectivement cette solution est violente. Et du coup, elle ne convient peut être pas dans le cadre d'un traitement JDBC occasionnel qui aurait besoin de la journalisation.

Benoit
bboulch est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h12.


 
 
 
 
Partenaires

Hébergement Web