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 :

Modifier la valeur d'un sequentiel pour toutes les tables sous oracle


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Par défaut Modifier la valeur d'un sequentiel pour toutes les tables sous oracle
    bonjour,
    je travaille sous éclipse sur une base de données oracle 9i, je voudrais modifier le sequentiel de toutes mes tables de façon généraliséé.
    Pour modifier le sequentiel d'une seule table j'ai écris ceci
    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
     
    	//Connexion
    		 connexionBd();
    		// recupération du max on l'appelle max_id
    		 Statement stmt=connexion.createStatement();
    		 ResultSet rs=stmt.executeQuery("select max(id) from application");
    		 int  max_id=0;
    		 while(rs.next()){
    			  max_id = rs.getInt("max(application)");	 
     
    		 }
     
    		 int new_increment=max_id+10000; 
    		 //Changement de l'auto_increment
    		 int i=stmt.executeUpdate(" alter sequence id  increment by "+new_increment);
    		 int a=stmt.executeUpdate("select id.NEXTVAL FROM dual");
    	     int b=stmt.executeUpdate("ALTER sequence id INCREMENT BY 1");
     
    		 System.out.println("max_id = "+max_id+" new_increment= "+new_increment);

    Et ça marche.
    Pour le reste je ne sais pas trop comment m'y prendre, je suis novice en jdbc,

    help please!!!!

  2. #2
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    A mon avis tu n'auras pas de requete SQL qui te fasse tout en une seule opération.

    Pour généraliser, il faut que les valeurs qui varient selon la table visée soient stockées dans des variables. Tu utilises en suite ces variables dans tes requetes.

    Pour chaque table il faut connaitre la valeur autoincrémentée. Tu peux par exemple utiliser une enum :

    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
    public Enum Tables {
      tableINTERFACE_PREV_MEMORY("matable1","id"),
      tablePARAM("maTable2","id2");
     
      private String name;
      private String seq; 
     
      private DBTables(String name, String seq) {
        this.name = name;
        this.seq = seq;
      }
     
      public String getName(){ return name;}
      public String getSeq(){return seq;}
     
    }
    puis faire un truc du genre (non testé):

    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
    import static Tables.*;
     
    // ...
    Resultset rs =null;
    for(Tables table : Tables.values()){
        rs=stmt.executeQuery("select max("+table.getSeq()+") seq from "+table.getName());
        int  max_id=0;
        if(rs.next()){
    	max_id = rs.getInt(1);	
        }
     
        max_id += 1000;
        //Changement de l'auto_increment
        int i=stmt.executeUpdate(" alter sequence "+table.getSeq()+"  increment by "+new_increment);
        int a=stmt.executeUpdate("select "+table.getSeq()+".NEXTVAL FROM dual");
        int b=stmt.executeUpdate("ALTER sequence "+table.getSeq()+" INCREMENT BY 1");
    }

    Après c'est pas forcément la meilleure manière de faire, mais bon ...

  3. #3
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Par défaut
    merci, c'est gentil, je fais le tester de suite

  4. #4
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Par défaut
    public Enum Tables {
    tableINTERFACE_PREV_MEMORY("matable1","id"),
    tablePARAM("maTable2","id2");

    par contre je ne comprend pas la déclaration en dessus. En déclarant
    tableINTERFACE_PREV_MEMORY("matable1","id"),
    tablePARAM("maTable2","id2");
    j'ai des erreurs , je ne comprends pas


    merci

  5. #5
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    ben en fait l'Enum te permettrait de lister toutes les tables qui sont à traiter. en fait là ma solution revient à faire une classe, l'utilisation d'une énumération n'est pas obligatoire ...

    les noms que j'ai choisi sont seulement arbitraire. Tu as des exemples et des tutos sur les enum sur le site.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public Enum Tables {
    nomDeMaPremiereTable("matable1","id"),
    nomDeMaDeuxiemeTable("maTable2","id2");
     
    // ici chaque élément de l'énumération contient le nom de la table et l'identifiant de la sequence
    ensuite dans le code tu peux directement utiliser "nomDeMaPremiereTable" et "nomDeMaDeuxiemeTable" comme des sortes de variables static initialisées.

    quelle est l'erreur que tu rencontres ?

  6. #6
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Par défaut
    j'arrive pas en fait en m'en sortir dans la déclaration,

    public enum Tables {

    firsTable (Matable1,id);
    secondeTable (MaTable2,id2);

    j'ai pas l'habitude d'utiliser les types énumerés
    je te remercie pour l'aide

  7. #7
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Par défaut
    ceci est la classe
    public enum Tables {

    firstable ("matable1" ,"id"),
    secondeTable("matable2" , "id2");
    private String name;
    private String seq;

    private void DBTables(String name, String seq) {
    this.name = name;
    this.seq = seq;}

    public String getName(){ return name;}

    public String getSeq(){return seq;}}


    voici ma seconde classe qui utilise la classe Tables

    import java.sql.*;

    import oracle.OracleDataSource;
    public class Tester {
    private Connection connexion;
    public void increment() throws SQLException{

    //Connexion
    OracleDataSource.connexionBd();
    // recupération du max on l'appelle max_seq
    Statement stmt=connexion.createStatement();
    ResultSet rs =null;
    for(Tables table : Tables.values()){
    rs=stmt.executeQuery("select max("+table.getSeq()+") seq from "+table.getName());
    int max_seq=0;
    if(rs.next()){
    max_seq = rs.getInt(1);
    }
    int new_increment=max_seq+10000;

    //Changement de l'auto_increment
    int i=stmt.executeUpdate(" alter sequence "+table.getSeq()+" increment by "+new_increment);
    int a=stmt.executeUpdate("select "+table.getSeq()+".NEXTVAL FROM dual");
    int b=stmt.executeUpdate("ALTER sequence "+table.getSeq()+" INCREMENT BY 1");
    }

    }

    }


    le probleme reside tout simplement dans la déclaration des variables dans la classe Tables.

    Je ne sais pas non plus qu'est ce qui cloche.
    je suis vraiment désolée.

  8. #8
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    Citation Envoyé par miai85
    public enum Tables {

    private void DBTables(String name, String seq) {
    }
    Ben ton constructeur !! ??

  9. #9
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Par défaut
    je te remercie pour cette grande patience,
    je n'ai plus d'erreur, je vais exécuter de suite

  10. #10
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Par défaut
    Pour l'instant j'ai des erreurs d'exécution, du type

    java.sql.SQLException: ORA-00942: Table ou vue inexistante

    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)

    je te remercie pour cette grande patience

  11. #11
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    Citation Envoyé par miai85
    java.sql.SQLException: ORA-00942: Table ou vue inexistante
    A mon avis tu n'as pas besoin de moi pour ça ...

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/08/2013, 15h19
  2. Réponses: 20
    Dernier message: 26/05/2011, 16h53
  3. Réponses: 5
    Dernier message: 26/03/2009, 20h15
  4. [2000] Même dimension pour toutes les tables
    Par Safaritn dans le forum SSAS
    Réponses: 6
    Dernier message: 12/02/2009, 14h27
  5. Modifier la valeur d'un sequentiel sous oracle
    Par miai85 dans le forum Oracle
    Réponses: 1
    Dernier message: 05/07/2007, 09h42

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