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

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Points : 13
    Points
    13
    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 expérimenté 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
    Points : 1 718
    Points
    1 718
    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 à l'essai
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    merci, c'est gentil, je fais le tester de suite

  4. #4
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Points : 13
    Points
    13
    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 expérimenté 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
    Points : 1 718
    Points
    1 718
    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 à l'essai
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Points : 13
    Points
    13
    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
    in
    in est déconnecté
    Membre expérimenté 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
    Points : 1 718
    Points
    1 718
    Par défaut
    Citation Envoyé par miai85
    public enum Tables {

    firsTable (Matable1,id),
    secondeTable (MaTable2,id2);
    Citation Envoyé par miai85
    j'ai pas l'habitude d'utiliser les types énumerés
    Fait une petite recherche sur le site, par exemple. Tu y trouveras les infos nécessaires. Tu aurais déjà corrigé ton pb si te le faisais ...

    [EDIT] La prochaine fois que tu as une erreur. Autant nous donner le message d'erreur comme ça, ça va plus vite ...

  8. #8
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    soit pas agressif,
    je te remercie pour l'aide.

  9. #9
    in
    in est déconnecté
    Membre expérimenté 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
    Points : 1 718
    Points
    1 718
    Par défaut
    Citation Envoyé par miai85
    soit pas agressif,
    je te remercie pour l'aide.
    Je le suis pas. Je voulais juste dire que là ça aurait été plus vite pour toi de consulter la doc ...

    Alors ça marche ou pas ?

  10. #10
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    lorsque je déclare ainsi :
    public static final SECONDETABLE("matable2" , "id2");

    voici l'erreur qui s'affiche:

    //mutiple markers at this line
    illegal modifier for th enum constant
    the constructeur Tables(String, String) is undefined//



    merci de bien vouloir repondre

  11. #11
    in
    in est déconnecté
    Membre expérimenté 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
    Points : 1 718
    Points
    1 718
    Par défaut
    Citation Envoyé par miai85
    lorsque je déclare ainsi :
    public static final SECONDETABLE("matable2" , "id2");
    Mais pourquoi tu déclares ainsi et pas comme dans mon exemple ???

    Le message d'erreur te dis qu'il n'y a pas de constructeur Tables(String, String)

    si tu as copié/collé mon exemple, c'est normal, ya une petite faute de frappe ... le constructeur défini s'appelle DBTables et non Tables ... en fait c'est un copié-collé foiré de ma part ....

  12. #12
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    je te remercie d'avoir été aussi patient avec moi, je me demande ce que je ferais sans toi, heureusement que t'es là!
    je comprends bien les messages d'erreurs affichés par éclipse
    c'est vrai que j'ai fais du copié collé, mais le probleme reside dans la déclaration des variables :
    public Enum Tables {
    tableINTERFACE_PREV_MEMORY("matable1","id"),
    tablePARAM("maTable2","id2");

    c'est toujours le meme message d'erreurs qui apparait.

    PS: j'ai lu des docs sur le type énuméré

  13. #13
    in
    in est déconnecté
    Membre expérimenté 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
    Points : 1 718
    Points
    1 718
    Par défaut
    Ben je sais pas ...

    Pour créer 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
    17
    18
    19
    20
    21
    22
    23
     
    public Enum monEnum {
     
       // là tu déclares tout les éléments de ton énum
       valeur1("table1","id1"),
       valeur2("table2","id2"),
       valeur3("table3","id3");
     
       // ici chaque valeur possède 2 champs :
       String table;
       String seq;
     
       // pour pouvoir initialiser ces valeurs, il faut un constructeur
       private monEnum(String table, String seq){
           this.table = table;
           this.seq = seq;
       } 
     
       // pour pouvoir accéder aux champs des différentes valeurs
       public String getTable() {return table;}
       public String getSeq() {return seq;}
     
    }
    si tu fais comme ça, ya pas de raison que ça marche pas ...

    Montre moi ce que tu fais ... parce que là, je peux pas plus t'aider ...

  14. #14
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Points : 13
    Points
    13
    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.

  15. #15
    in
    in est déconnecté
    Membre expérimenté 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
    Points : 1 718
    Points
    1 718
    Par défaut
    Citation Envoyé par miai85
    public enum Tables {

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

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

  17. #17
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Points : 13
    Points
    13
    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

  18. #18
    in
    in est déconnecté
    Membre expérimenté 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
    Points : 1 718
    Points
    1 718
    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 ...

  19. #19
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    je le sais, je tenais a te remercier
    bon courage

+ 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