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 :

recuperer les métadonnées d'un type complexe d'une BDD objet-relationnelle


Sujet :

JDBC Java

  1. #1
    Futur Membre du Club
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    9
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 9
    Points : 7
    Points
    7
    Par défaut recuperer les métadonnées d'un type complexe d'une BDD objet-relationnelle
    Bonjour,
    Je travaille sur une BDD objet relationnelle dans oracle 10g, qui contient des types complexes (types créés par l'utilisateur) .
    Je doit recuperer avec java les attributs d'un type complexe (leurs noms et leurs types), alors pour chaque table je recupere les metadonnées de ses attributs;
    puis je cherche si le type de l'attribut est simple ou complexe. si l'attribut est de type complexe, en ce moment là je doit recuperer le nom et le type de ses sous attributs, mais je ne trouve pas les bonnes methodes qui font ça???
    merci de m'aider.
    mon code est comme suit:

    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
    Class.forName (driver);
    	    	Connection conn=null;
    	             conn = DriverManager.getConnection(url, user, pswd);
    			Statement state = conn.createStatement();
    		    String[] TABLE_TYPES = {"TABLE"};
    		    DatabaseMetaData resultSchema = conn.getMetaData();
    		    ResultSet tables = resultSchema.getTables  (conn.getCatalog  () , schema, "%", TABLE_TYPES);
    		    while (tables.next())
    		    {
    		    	  String t =tables.getString("TABLE_NAME");
    		  		  ResultSet att = resultSchema.getColumns(conn.getCatalog(), schema, t, "%");//pour chercher les attributs de la table
    		  		  //affichage des informations
    		  		  ResultSetMetaData rsmd = att.getMetaData(); 
    		  		  while(att.next()){
    		  			  trouv=false;
    		  			   for(int i=0; i<rsmd.getColumnCount(); i++){
    		  				   String col = rsmd.getColumnName(i+1);
    		  				   if(trouv==false)
    		  				      {
    						  		if (col.equals("DATA_TYPE"))//java.sql.types
    						  			{
    						  				trouv=true;
    						  				if(att.getObject(i+1).toString().equals("1111"))    //si c'est un type complexe
    						  					 {
    						  						 typeSimple=false;
    						  						 //System.out.println("c'est un type complexe"+  typeSimple);
    						  					 }
    						  					 else    //si c'est un type simple
    						  					 {
    						  						 typeSimple=true;
    						  						//System.out.println("c'est un type simple"+  typeSimple);
    						  					 }
     
    						  				for(int j=0; j<rsmd.getColumnCount(); j++){
    						  					String col2 = rsmd.getColumnName(j+1);
    						  					if (col2.equals("COLUMN_NAME"))
    								  			{
    								  			 Object val = att.getObject(j+1);
    								  			 //System.out.println(col2+" = "+val);
    								  			 //System.out.println("******* typeSimple est à:    "+ typeSimple  );
     
    											   if(typeSimple==true)
    						  					   {
    												   //faire mon traitement
    								  			   }
    								  				else //c.à.d c'est un type complexe
    								  			    {
    								  				    //recuperer les noms et les types des sous attributs de ce type complexe  
     
     
    								  			     }

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Regarde du coté de

    ((oracle.jdbc.OracleResultSet)att).getOracleObject(i+1) Et regarde ce que ca te retourne comme type. Je pense que ça va te retrourner un oracle.sql.STRUCT ou quelque chose de similaire. A partir de là faudra explorer les méthodes disponibles sur l'objet retourné.

  3. #3
    Futur Membre du Club
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    9
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Bonjour,
    Merci pour votre reponse tchize_ , j'ai fait ce que vous avez dit, mais quand j'execute je reçois cette exception: SQLException: java.math.BigDecimal cannot be cast to java.sql.Struct.
    D'où vient ce probleme ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	if(att.getObject(i+1).toString().equals("1111"))    //si c'est un type complexe
    						  					 {
    						  				  						 typeSimple=false;
    						  						 System.out.println("c'est un type complexe  "+  typeSimple);
     
    						  						Struct struct =(Struct)att.getObject(i+1);
    						  						Object[] valeurs = struct.getAttributes();
    						  						int nb= valeurs.length;
    							  					System.out.println("nombre : " +nb);
    							  					for(int m=0; m<nb;m++)
    							  					{
    							  						System.out.println("le sous type   "+valeurs[i]);
    							  					}

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ce n'est pas le code que j'ai donné.
    De plus, j'ai bien précisé "regarde ce que ca te retourne comme type". Donc fait le et dit nous ce que ça sort comme type.

  5. #5
    Futur Membre du Club
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    9
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Bonjour,
    désolé pour le retard;
    j'est éssayé d'avancer dans mon travail puis revenir à ce pb;
    le type retourné est oracle.sql.NUMBER

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ta colonne m'a tout l'air d'être de type "Number" alors, je ne vois pas de données complexe dans l'histoire. Tu es sûr que tu regarde la bonne colonne?

  7. #7
    Futur Membre du Club
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    9
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    bonjour,
    en fait le probleme est réglé,
    j'ai utilisé un descripteur, et le code est comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ResultSet rt =connexionOracle.execQuery(url, user, pswd,"SELECT * FROM "+t);//t est ma table
    								  					rt.next();
    								  					String type=val.toString();//l'attribut complexe
    								  					Struct struct =(Struct)rt.getObject(type);
     
    								  					//creer un descripteur
    								  					Connection connection=DriverManager.getConnection(url,user,pswd);
    								  					StructDescriptor structdesc = StructDescriptor.createDescriptor(struct.getSQLTypeName(), connection);
     
    								  					for(int m=1; m<=structdesc.getMetaData().getColumnCount();m++)
    								  					{
    								  						String souatt=structdesc.getMetaData().getColumnName(m);
    }
    tchize_ je te remercie pour ton aide.

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/05/2009, 19h36
  2. [AXIS2] Envoi d'un type complexe dans une requête SOAP
    Par godolf dans le forum Services Web
    Réponses: 4
    Dernier message: 20/05/2008, 13h51
  3. Réponses: 1
    Dernier message: 20/02/2008, 11h34
  4. Recuperer les max des dates à partir d'une autre table
    Par inabil dans le forum Langage SQL
    Réponses: 8
    Dernier message: 20/11/2006, 15h19
  5. [SQL] recupere les valeurs d'un liste puis faire une requete SQL
    Par 18Marie dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 22/06/2006, 12h50

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