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

JDBC Java Discussion :

Suppression de lignes table SQL et ResultSet


Sujet :

JDBC Java

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 14
    Points : 3
    Points
    3
    Par défaut Suppression de lignes table SQL et ResultSet
    Bonjour,
    Je rencontre un problème pour lequel je ne trouve pas de solution depuis plusieurs jours maintenant.
    J'ai un programme codé en JAVA qui se connecte à une base de données. Jusque la tout va bien. Une fois connecté a ma BDD, je souhaite la parcourir pour la "nettoyer". Je m'explique : Cette table est sous la forme suivant :
    une clé primaire, un identifiant, une date, une consommation. Parmi ces champs, l'identifiant peut parfois être le même (VARCHAR), la date aussi (format Date/Time TIMESTAMP), et la conso differe toujours. Ce que je veux faire :
    Nettoyer ma table en ne laissant qu'une seule valeur pour un identifiant donné si la date est antérieure a 14 jours. Par exemple, si pour l'identifiant "tom", si j'ai 15 lignes à la date du 1er janvier avec cet identifiant, je ne voudrais en garder qu'une seule (peu importe laquelle). J'ai besoin de pouvoir faire ca pour chacun des identifiants de ma table.
    J'espère avoir été clair dans mon explication, voici le code de la fonction que j'appelle pour effectuer le nettoyage de ma table :


    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
                                                
    /* Classe Main */
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    
    
    public class Main {
    
    	/**
    	 * @param args
    	 * @throws SQLException 
    	 * @throws ClassNotFoundException 
    	 * @throws ParseException 
    	 */
    	public static void main(String[] args) throws ClassNotFoundException, SQLException, ParseException {
    		// TODO Auto-generated method stub
    		SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Connection c;
            ConnexionBDD conn = new ConnexionBDD();
    		   c = conn.connect();
            Statement state = c.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
            Fonctions fonc = new Fonctions();
            fonc.NettoyerTables(c, simple);
    
    	}
    
    }
    
    
    
    /* Classe Fonctions */
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.sql.Timestamp;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    
    
    public class Fonctions {
    
    	
    	@SuppressWarnings({ "unchecked", "deprecation" })
    	public void NettoyerTables(Connection c, SimpleDateFormat simple) throws SQLException, ParseException{
    		
    		Timestamp date_present = new Timestamp (new java.util.Date().getTime());
    		int i = 0;
    		Statement state = c.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
    		
    		try{
    			ResultSet r2 = state.executeQuery("SELECT * FROM table_donnees WHERE (TO_DAYS('" + date_present + "') - TO_DAYS(date) > 14) GROUP BY idcpt ORDER BY date DESC");
    			
    			while (r2.next()  ) {
    				Timestamp date_ancienne = new Timestamp (simple.parse(r2.getString("date")).getTime());
    				String idcpt = r2.getString("idcpt");
    				System.out.println("date ancienne : " + date_ancienne + " //\\ idcpt concerne : " + idcpt);	
    				if(r2.next() && !(r2.isClosed())){
    					Timestamp date_ancienne2 = new Timestamp (simple.parse(r2.getString("date")).getTime());
    					if(date_ancienne.getDate() == date_ancienne2.getDate() && date_ancienne.getMonth() == date_ancienne2.getMonth() && date_ancienne.getYear() == date_ancienne2.getYear()){
    						r2.deleteRow();
    					}		
    					else{
    						r2.previous();
    					}
    				}
    			}
    		}	
    		catch (Exception e){
    			e.printStackTrace();
    		}
    	}
    	Fonctions() {}
    }
    
    
    /* Classe ConnexionBDD */
    import java.sql.*;
    import java.util.Properties;
    
    public class ConnexionBDD
    {
      // The JDBC Connector Class.
      private static final String dbClassName = "com.mysql.jdbc.Driver";
    
      private static final String CONNECTION =
                              "jdbc:mysql://127.0.0.1/dbvalorisation";
    
      public Connection connect() throws
                                 ClassNotFoundException,SQLException
      {
      //  System.out.println("JDBC Connector class : "+dbClassName);
        Class.forName(dbClassName);
        // Properties for user and password. Here the user and password are both 'gazeo'
        Properties p = new Properties();
        p.put("user","gazeo");
        p.put("password","gazeo");
        // Now try to connect
        Connection c = DriverManager.getConnection(CONNECTION,p);
        // A UTILISER DANS MAIN
        /*Statement state = c.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
        
        ResultSet result = state.executeQuery("SELECT conso FROM table_donnees_eau WHERE ID = 1");
        result.absolute(1);
        state.executeUpdate("UPDATE table_donnees_eau SET conso = 12 WHERE ID = 1");
        state.close();
        c.close();*/
        return c;
        }
      ConnexionBDD() {
      }
      
    }


    Je précise que ma table contient bien des lignes pour lesquelles l'identifiant et la date sont les mêmes, et que ces dates sont bien antérieures à 14 (J'ai changé la date de mon pc)
    Merci d'avance à ceux qui auront le courage de m'aider !

  2. #2
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 534
    Points : 562
    Points
    562
    Par défaut
    Bonjour,

    Peux-tu poster ton code avec la balise CODE (c'est plus lisible)?

    Et c'est quoi ton probleme ou des erreurs?

  3. #3
    Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Mon problème est que ma table n'est pas nettoyée comme je le veux (rien n'est supprimé)
    La console m'affiche :
    Date ancienne : une date anterieure a 14 jours //\\ idcpt concerne : un identifiant
    Date ancienne : une 2eme date anterieure a 14 jours //\\ idcpt concerne : un 2eme identifiant

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 526
    Points
    9 526
    Billets dans le blog
    1
    Par défaut
    La connexion est en auto-commit ou non ?
    Si non, rien ne sera "réellement" supprimé avant que la transaction ne soit validée (commit)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Je pense que la connexion a la BDD est bien configurée puisque je suis capable de créer une requête qui supprime toutes les entrées de ma table.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 149
    Points : 167
    Points
    167
    Par défaut
    Attention tu avances deux fois ton resultset :

    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
    while (r2.next()  ) {
    				Timestamp date_ancienne = new Timestamp (simple.parse(r2.getString("date")).getTime());
    				String idcpt = r2.getString("idcpt");
    				System.out.println("date ancienne : " + date_ancienne + " //\\ idcpt concerne : " + idcpt);	
    				if(r2.next() && !(r2.isClosed())){
    					Timestamp date_ancienne2 = new Timestamp (simple.parse(r2.getString("date")).getTime());
    					if(date_ancienne.getDate() == date_ancienne2.getDate() && date_ancienne.getMonth() == date_ancienne2.getMonth() && date_ancienne.getYear() == date_ancienne2.getYear()){
    						r2.deleteRow();
    					}		
    					else{
    						r2.previous();
    					}
    				}
    			}
    Sinon pour supprimer dans une base il faut executer une commande SQL du type delete. La commande r2.deleteRow(); sert a supprimer la ligne du resultset et non de la base .

    Si j'ai bien compris, ton besoin est de supprimer l'ensemble des doublons par identifiant des 15 derniers jours ?

    Tu peux peut être essayer de le faire en une requête sur oracle ca donnerait ca, je ne sais pas si tu peux l'adapter à ton sgbd (postgress?)

    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
     
    SELECT  tb.*
         FROM table_donnees tb ,
         /* selection des lignes a conserver */
        (SELECT   tb2.ID as ID2, max(tb2.date_ref) as DTREF2
             FROM table_donnees tb2
            WHERE sysdate - tb2.date_ref <= 14
         GROUP BY ID
            HAVING COUNT (tb2.ID) > 1) vue_tb
        WHERE
        /* on ne supprime que les lignes ayant moins de 14 jours */ 
        sysdate - tb.date_ref <= 14
        /* qui n'est pas la date la plus recente */
        and tb.DATE_REF!=vue_tb.dtref2
        and tb.id=vue_tb.id2
    Si tu veux conserver la gestion de comparaison 2 par 2 travaille ton algo, ici tu vas comparer le tuple 1 avec le 2, puis le 3 avec le 4. Tu ne compareras pas le 2 avec le 3.

    En espérant t'avoir aidé.
    Mon site : TKT-Web =)

  7. #7
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 534
    Points : 562
    Points
    562
    Par défaut
    Bonjour,

    Il se pourrait que ton probleme lie a l'utilisation de ResultSet.CONCUR_UPDATABLE.

    Vois ce lien http://www.exampledepot.com/egs/java...ResultSet.html

    Et essais de changer ta requette comme ils ont suggere

Discussions similaires

  1. [PDO] Suppression d'une ligne dans une table sql
    Par Jess86 dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 25/03/2015, 20h23
  2. [MySQL] Suppression d'une ligne d'une table sql
    Par valvalval dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 26/06/2008, 10h10
  3. Suppression de ligne dans plusieurs table
    Par chris60 dans le forum Oracle
    Réponses: 6
    Dernier message: 27/04/2006, 17h46
  4. [PL/SQL] suppression de ligne
    Par FeTi dans le forum Oracle
    Réponses: 2
    Dernier message: 06/04/2006, 10h35
  5. Réponses: 4
    Dernier message: 26/01/2006, 12h03

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