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 :

ORACLE : mapping de Type


Sujet :

JDBC Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 38
    Points
    38
    Par défaut ORACLE : mapping de Type
    Bonjours,

    J'essaie de recurer un type object dans un resultset mais je ne vois pas mon erreur. J'ai pourtant bien suivit la documentation :

    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
     
     
    -- En Oracle
    Create or replace type type_f1 as object (  member_1 varchar2(10 ) ) ;
    Type created.
     
     
    SQL> create table tbl_typ_f1 ( col1 type_f1 );
    Table created.
     
    SQL> insert into tbl_typ_f1 values (type_f1('AAAAA') );
     
    1 row created.
    SQL> commit ;
     
    Commit complete.
     
     
    -- en Java 
    Package dbaj
     
    public class t2 {
        private  Object ft2 ;        // mon unique member    
        public Object getFt2() { return ft2 ; }   // ma classe d'access get
        public t2(Object o) {
          ft2=o;
        }
        }
     
     
    -- Dans une autre source on veut selectionner la colonne 
    .
    .
    .
             String  sql="select col1 from tbl_typ_f1" ;
            Statement stmt =  conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);   // Conn == Connection
            java.util.Map myMap = conn.getTypeMap();
            myMap.put("SYS.TYPE_F1",Class.forName("dbaj.t2"));
           conn.setTypeMap(myMap);
            ResultSet rset = stmt.executeQuery(sql);
     
     
            String s;
            while (rset.next()){
                 t2 tt= (t2)rset.getObject(1);
                 s=tt.getFt2().toString();
                 System.out.println("s="+s);
            }
    Et j'herite de :


    java.sql.SQLException: Inconsistent java and sql object types: InstantiationException: dbaj.t2
    at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)



    si je remplace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
      t2 tt= (t2)rset.getObject(1);
     
    --par
     
       t2 tt= (t2)rset.getObject(1,myMap);
    C'est le meme message d'erreur. La j'avoue que j'ai cherché mais je ne vois pas. Ce qui est ralant c'est que je vois le string 'AAAAA' dans le debugger mais il apparait ["",'AAAAAA']. Un get metadata.typename retourne SYS.TYPE_F1. Alors pourquoi ne puis-je mapper un object Oracle a un object Java ?

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Bon j'ai trouvé une methode en utilisant STRUCT. Cela ne fait pas intervenir une classe Java locale qui mappe celle d'oracle. Ca c'est vraiment domage.

    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
     
     
            sql="select col1 from tbl1" ;
            Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
            ResultSet rset = stmt.executeQuery(sql);
            Object[] object1Values ;
     
            while (rset.next()){
                oracle.sql.STRUCT object1  = (oracle.sql.STRUCT)rset.getObject(1);
                object1Values = object1.getAttributes();
                String s1= object1Values[0].toString();
                System.out.println("s1=" + s1 );
     
            }            
            System.out.println("End ");

    Et dans la foulée voila comment on charge en java la valeur d'un object gigognes (le member d'un type oracle object est lui meme un oracle object:

    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
     
     
     
    Create or replace type obj1 as object (  m1 varchar2(10 ) ) ;
    create or replace type obj2 as object (   m2a varchar2(10),     m2b obj1 ) ;
    create table tbl2 ( col21 number, col22 obj2 ) ;
    insert into tbl2 values(1,obj2('mmmmm2',obj1('XXXXX') ) ) ;
     
    select col21, col22 from tbl2;
     
       COL21      COL22(M2A, M2B(M1))
    ----------   ------------------------
    1                OBJ2('mmmmm2', OBJ1('XXXXX')
     
     
    // en java :
     
     
            sql="select col21, col22 from sys.tbl2" ;
            Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
            ResultSet rset = stmt.executeQuery(sql);
            Object[] object1Values ;
            Object[] object1ValuesCol22 ;
            while (rset.next()){
                Integer i = rset.getInt(1);
                String s=i.toString();
                oracle.sql.STRUCT object1  = (oracle.sql.STRUCT)rset.getObject(2);
                object1Values = object1.getAttributes();
                String s1= object1Values[0].toString();
                object1ValuesCol22=((oracle.sql.STRUCT)object1Values[1]).getAttributes() ;         // fafut positioner soit meme l'indice ou l'on va faire le cast. Moche
     
                String s2 = (String)object1ValuesCol22[0];
                System.out.println("s1=" + s1 + " S2=" + s2);
     
            }            
     
    //output
     
    s1=mmmmm2 S2=XXXXX


    Mais bon je ne considere pas le probleme résolu car c'est moche, lourd et surout si ont change la structure de l'object oracle il faut retoucher en java les positions (indice) de STRUCT dans les tableaux of Object :

    je vise notament la ligne :

    object1ValuesCol22=((oracle.sql.STRUCT)object1Values[1]).getAttributes() ;

    Ou l'indice doit coller a la structure de OBJ2, notamment l'emplacement de la colone du type OBJ1 a l'interieur de l'object OBJ2.

Discussions similaires

  1. Mapping Boolean type in Oracle
    Par naou18 dans le forum JPA
    Réponses: 14
    Dernier message: 02/08/2011, 15h18
  2. oracle conversion de type
    Par vinczente dans le forum SQL
    Réponses: 1
    Dernier message: 04/05/2007, 11h59
  3. [ORACLE 9iR2] REMOTE TYPE
    Par Nick_Holmes dans le forum Oracle
    Réponses: 1
    Dernier message: 02/11/2006, 17h31
  4. [Oracle 9.1] Types de retour d'une fonction PL/SQL
    Par ftrifiro dans le forum PL/SQL
    Réponses: 8
    Dernier message: 12/10/2005, 16h54

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