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

  1. #1
    Candidat au Club
    Inscrit en
    juin 2002
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 3
    Points : 2
    Points
    2

    Par défaut Récupération d'une liste de structures Oracle via Java

    Bonjour,

    Depuis quelques jours, j'essaie de récupérer le contenu d'une liste de structures via JAVA. Pour infos :
    - jdk 1.4.2
    - Oracle 10g
    - Serveur Tomcat

    Pour cela, j'ai tout d'abord créé un type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TYPE LIGNE_DIAGNOSTIC AS OBJECT
    (membre1 VARCHAR2(500),
     membre2 VARCHAR2(500),
     membre3 VARCHAR2(500),
     ...;)
    puis un type permettant de faire une liste de celui-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CREATE OR REPLACE TYPE LIGNES_DIAGNOSTIC AS TABLE OF LIGNE_DIAGNOSTIC INDEX BY PLS_INTEGER;
    Pour remplir ma liste d'objet, j'utilise la méthode suivante :
    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
     
    PROCEDURE PS_GET_DIAGNOSTIC  (...
    	                                 P_LISTE_DTOS	  OUT   LIGNES_DIAGNOSTIC,
    	                                 ...) IS
    ...
    C_LISTE_DTOS		  C_LISTE;
    ...
    BEGIN
    OPEN C_LISTE_DTOS FOR SELECT membre1 as membre1,
    				              membre2 as membre2,
                                                  null as membre3,
    					      ....
                                                  FROM tableMembre;
    loop		
          FETCH C_LISTE_DTOS bulk collect INTO P_LISTE_DTOS;
          exit when C_LISTE_DTOS%notfound;
          FOR i IN C_LISTE_DTOS.FIRST..C_LISTE_DTOS.LAST LOOP
                P_LISTE_DTOS(i).membre3 := 'test';
          END LOOP;
    end loop;
    CLOSE C_LISTE_DTOS;
    ....
    END PS_GET_DIAGNOSTIC;
    Cette procédure me permet de renvoyer un tableau de type 'LIGNES_DIAGNOSTIC' contenant un ensemble d'objets 'LIGNE_DIAGNOSTIC'.

    Il semble que cette prodstock fonctionne comme il faut, j'ai fait un test avec une écriture dans un fichier, et tout était correct. Le problème se pose au moment de la récupération sous JAVA. Pour cette opération, j'ai écrit la méthode suivante :

    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
     
     public static final String PS_GET_DIAGNOSTIC = "{call PKG_TEST.PS_GET_DIAGNOSTIC(?,?,?,?,?,?,?,?)}";
     
    public List getDtoForDiagnostic(...) throws DataAccessException {
            List dtos = null;
            ...
            Connection conn = HibernateUtil.getConnection();
            OracleCallableStatement ocs = null;
            ...
            try {
                   ocs = (OracleCallableStatement) ((DelegatingCallableStatement) conn
                        .prepareCall(PS_GET_DIAGNOSTIC)).getDelegate();
                   ....
                   ocs.registerOutParameter(4, OracleTypes.ARRAY, "LIGNES_DIAGNOSTIC");
     
                  ocs.execute();
     
                 Object[] values = (Object[]) ocs.getArray(4).getArray();
                 List resultats = new ArrayList();
     
                 for (int i = 0; i < values.length; i++) {
                    List ligne = null;
     
                    ligne = new ArrayList();
     
                    STRUCT res = (STRUCT) values[i];
                    Object[] objects = res.getAttributes();
     
                    ligne.add((String) objects[0]);
                    ligne.add((String) objects[1]);
                    ligne.add((String) objects[2]);
                    ...
     
                    resultats.add(ligne);
                }
          return resultats;
    }
    Le souci est que lors de cette récupération, les données contenues dans chaque structure sont systématiquement égal à la chaîne : "???". La liste des structures est donc correctement récupérée, mais les variables que celles-ci contiennent sont altérées.

    Je ne comprends pas pourquoi, si quelqu'un a une idée je suis preneur.

    Merci d'avance.

  2. #2
    Candidat au Club
    Inscrit en
    juin 2002
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 3
    Points : 2
    Points
    2

    Par défaut

    UP !

    Toujours personne pour ce problème ? même pas la moindre idée ?

  3. #3
    Candidat au Club
    Inscrit en
    juin 2002
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 3
    Points : 2
    Points
    2

    Par défaut Solution

    Bon ça n'intéresse peut être personne, mais j'ai finalement réussi à résoudre mon problème, en modifiant ma procédure stockée.

    Tout d'abord, j'ai modifié la déclaration de mes types :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TYPE LIGNE_DIAGNOSTIC AS OBJECT
    (membre1 VARCHAR2(500),
     membre2 VARCHAR2(500),
     membre3 VARCHAR2(500),
     ...;)
     
    CREATE OR REPLACE TYPE LIGNES_DIAGNOSTIC AS TABLE OF LIGNE_DIAGNOSTIC;
    Ensuite, plutôt que de renvoyer la liste des mes éléments à JAVA, j'ai cherché à stocker mes résultats dans un curseur (qui est trés facilement géré par JAVA) :

    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
     
    PROCEDURE PS_GET_DIAGNOSTIC  (...
    	                                 P_LISTE_DTOS	  OUT   LIGNES_DIAGNOSTIC,
    	                                 ...) IS
    ...
    LIGNES			       LIGNES_DIAGNOSTIC;
    C_LISTE_DTOS	          C_LISTE;
    ligne     		         LIGNE_DIAGNOSTIC;
    membre1		             VARCHAR2 (500);
    membre2			     VARCHAR2 (500);
    membre3		             VARCHAR2 (500);
    ...
    BEGIN
    OPEN C_LISTE_DTOS FOR SELECT membre1 as membre1,
                                 membre2 as membre2,
                                 null as membre3,
                                 ....
                        FROM tableMembre;
     
    -- On instancie un tableau composé de lignes
    LIGNES := LIGNES_DIAGNOSTIC();
    loop		
          -- On peuple cette ligne grâce aux infos récupérés dans le curseur
          FETCH C_LISTE_DTOS INTO membre1,membre2,membre3;
          exit when C_LISTE_DTOS%notfound;
     
         -- On instancie un objet ligne, qu'on peuple avec les infos issues du curseur
         ligne := LIGNE_DIAGNOSTIC(membre1,membre2,membre3);
     
         -- Traitement intermédiaire
         ligne.membre3 := GET_NUMERO_COMPTEUR();
         ...
         -- On agrandit la taille du tableau d'une cellule
         LIGNES.EXTEND;
     
         -- On ajoute la ligne au tableau
         LIGNES(LIGNES.count) := ligne;
    end loop;
     
    CLOSE C_LISTE_DTOS;
     
    -- On peuple le curseur de sortie avec les lignes du tableau
    OPEN P_LISTE_DTOS FOR SELECT * FROM TABLE(LIGNES);
    ....
    END PS_GET_DIAGNOSTIC;
    Pour info, la fonction GET_NUMERO_COMPTEUR(), est une fonction récupérant un numéro de série. Ce numéro est mit à jour puis renvoyé. Ce type de fonction (fonction contenant des instructions DML(insert, update, delete...)) ne peut être utilisée dans un curseur ou une requête. J'ai donc été obligé de récupérer mes infos (avec le premier curseur), d'inclure les résultats dans une liste, de traiter l'élément concerné par la fonction, puis de renvoyer la liste via un curseur avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    OPEN P_LISTE_DTOS FOR SELECT * FROM TABLE(LIGNES);
    Sous Java, il est trés simple de récupérer le contenu d'un curseur :

    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
     
    public List getDtoForDiagnostic(String[] ids) throws DataAccessException {
            List dtos = null;
            DiagnosticDto dto = null;
            Connection conn = HibernateUtil.getConnection();
     
            OracleCallableStatement ocs = null;
            OracleResultSet ors = null;
     
            try {
                ocs = (OracleCallableStatement) ((DelegatingCallableStatement) conn
                        .prepareCall(NOM_PROD_STOCK)).getDelegate();
     
                // params de sortie (erreurs)
                //ocs.registerOutParameter(index,type);
     
                // parametres de sortie (liste des résultats)
                ocs.registerOutParameter(2, OracleTypes.CURSOR);
     
                //On set les paramètres éventuels...
                ocs.setString(3, ids);
     
                // Exécution
                ocs.execute();
     
                //Récupération du curseur
                ors = (OracleResultSet) ocs.getCursor(2);
     
                if (ors != null) {
                    while (ors.next()) {
                          // Traitement des résultats contenus dans le curseur...
                    }
                }
            } catch (SQLException ex) {
                //gestion des exeptions....
            } finally {
                //Fermerture du curseur....
                JDBCUtil.close(ors);
                JDBCUtil.close(ocs);
            }
          //renvoie du résultat...
        }
    Ce n'était pas plus compliqué que ça

    ++

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

Discussions similaires

  1. connecter a une base de donnee oracle via java
    Par papousou dans le forum JDBC
    Réponses: 2
    Dernier message: 15/07/2009, 16h18
  2. Réponses: 0
    Dernier message: 26/03/2008, 11h55
  3. Récupération d'une liste déroulante
    Par artotal dans le forum Formulaires
    Réponses: 1
    Dernier message: 29/10/2006, 00h29
  4. Réponses: 7
    Dernier message: 18/04/2006, 18h44
  5. Réponses: 10
    Dernier message: 16/03/2005, 19h25

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