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 :

Passer un tableau de structure depuis une fonction PLSQL vers un programme Java


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2012
    Messages : 14
    Points : 15
    Points
    15
    Par défaut Passer un tableau de structure depuis une fonction PLSQL vers un programme Java
    Ma fonction PL/SQL doit retourner un tableau de structure, que je récupère dans mon programme java.

    Les types crées pour l’occasion sont les suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    TYPE t_ligne_livraison AS OBJECT (
     index_f number,
     num_piece number,
     d_debliv date,
     d_finliv date,
     ty_piece varchar2(3),
     mag  varchar2(3)
    );
     
    TYPE t_table_livraison AS TABLE OF t_ligne_livraison;
    Voici mon code Java pour appeler la fonction, récupérer et afficher le résultat :

    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
    String sqlProcedure = "{? = call EMC2.pk_report_date_livraison.selectionnerModele(?)}";
    CallableStatement instruction = connex.prepareCall(sqlProcedure);
    instruction.registerOutParameter(1, OracleTypes.ARRAY, "EMC2.T_TABLE_LIVRAISON");
    instruction.setString(2, p_modele);
    instruction.execute();
    ARRAY resultArray = (ARRAY)instruction.getArray(1);
    Object[] resultStructArray = (Object[])resultArray.getArray();
    for (int i = 0; i < resultArray.length(); i++)
    {
    	STRUCT resultElement = (STRUCT)resultStructArray[i];
    	for (int j = 0; j < 6; j++)
    		System.out.print("'"+resultElement.getAttributes()[j]+"' ");
    	System.out.println("");
    }
    instruction.close();
    Voici un extrait du résultat obtenu :

    '2006' '202' '2007-01-22 00:00:00.0' '2007-04-30 00:00:00.0' '???' '???'
    '2006' '416' '2007-03-01 00:00:00.0' '2007-03-31 00:00:00.0' '???' '???'
    '2006' '380' '2007-01-22 00:00:00.0' '2007-04-30 00:00:00.0' '???' '???'
    Les number et date s'affichent correctement, cependant les informations concernant les varchar2 sont corrompus ou perdu en chemin.

    Je ne détaille pas la fonction PL/SQL, le problème ne vient pas de là mais du coté de Java, puisque quand j'appelle ma fonction dans SQL Plus le tableau s'affiche correctement.

  2. #2
    Traductrice
    Avatar de Mishulyna
    Femme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 504
    Points : 7 840
    Points
    7 840
    Par défaut
    Bonjour,

    La synthaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.print("'" + variableString + "'");
    donne une erreur en Java. Essaie un if pour j == 4 et j == 5 avec un autre format d'affichage, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.print("/'/" + variableString + "/'/");
    si tu tiens vraiment à tes simple quotes ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.print(variableString);
    Chaque fois que tu dis "je ne peux pas", n'oublie pas d'ajouter le mot "encore".

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2012
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Mishulyna Voir le message
    Bonjour,

    ...
    Merci pour votre réponse, malheureusement, cela n'a rien changé.

  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
    Citation Envoyé par Mishulyna Voir le message
    Bonjour,

    La synthaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.print("'" + variableString + "'");
    donne une erreur en Java.
    Pardon?


    concernant le code d'affichage, donne nous plutôt ceci:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	for (int j = 0; j < 6; j++){
    		System.out.print(resultElement.getAttributes()[j].getClass().getName()+"='"+resultElement.getAttributes()[j]+"' ");
            }
    Ca nous aidera déjà à connaitre le type des valeurs.

    Ensuite, concernant tes varchar2, y a-t-il des caractères particuliers (accentués, chinois, arabe, russe, ...) pouvant justifier d'une impossibilité de transcodage vers des encodages plus limités?

    Souvent, quand oracle retourne des ? c'est qu'une impossibilité de transcodage existe.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2012
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Les valeurs sont affichés dans le même ordre que dans la déclaration du type, cad :
    number number date date varchar2(3) varchar2(3)

    Sinon voila ce qui est affiché :
    java.math.BigDecimal='2004'
    java.math.BigDecimal='15'
    java.sql.Timestamp='2005-05-12 00:00:00.0'
    java.sql.Timestamp='2005-06-30 00:00:00.0'
    java.lang.String='???'
    java.lang.String='???'
    java.math.BigDecimal='2004'
    java.math.BigDecimal='219'
    java.sql.Timestamp='2005-02-01 00:00:00.0'
    java.sql.Timestamp='2005-06-30 00:00:00.0'
    java.lang.String='???'
    java.lang.String='???'
    java.math.BigDecimal='2004'
    java.math.BigDecimal='55'
    java.sql.Timestamp='2005-04-19 00:00:00.0'
    java.sql.Timestamp='2005-06-30 00:00:00.0'
    java.lang.String='???'
    java.lang.String='???'
    Les caractères présents dans les champs ty_piece et mag sont des caractères alphanumériques de base, aucun accent ni caractère particulier.

  6. #6
    Traductrice
    Avatar de Mishulyna
    Femme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 504
    Points : 7 840
    Points
    7 840
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Pardon?
    J'ai tapé bêtement une instruction dans ce genre là dans l'IDE et j'ai eu un petit cercle rouge avec un signe d'exclamation noir à la ligne en question...

    Sinon l'utilisateur avait bien expliqué son problème, on est censés rester humains, merde!

    Je sais bien ce qui est de foirer pendant des jours sur un truc tout con, j'imagine que ça vous est arrivé aussi car pas possible que vous soyez né "Responsable de service informatique"!

    Je m'en fous des pouces verts, je sais bien qu'on n'est pas sur Facebook, je ne veux qu'aider les autres! Et ça m'est déjà arrivé que lors d'une discussion un peu "à côté de la plaque" la bonne idée me vienne enfin dans ma tête si blonde...


    @Koerty: après des heures de lecture sur le site et les forums d'Oracle: pourquoi encoder une variable chaîne de caractères en varchar2(3) qui de plus demande (3byte) ou (3char) et pas tout court en char(3). Vérifier le type d'encodage: est-ce ASCII, UTF8, autre?
    Chaque fois que tu dis "je ne peux pas", n'oublie pas d'ajouter le mot "encore".

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/12/2009, 12h38
  2. Comment passer un tableau à deux dimensions dans une fonction
    Par Niko_de_bordo dans le forum Débuter
    Réponses: 2
    Dernier message: 02/07/2009, 15h15
  3. passer un tableau en argument dans une fonction
    Par rogerio dans le forum Débuter
    Réponses: 6
    Dernier message: 30/10/2008, 12h15
  4. Réponses: 2
    Dernier message: 12/05/2007, 01h57
  5. Passer un tableau en parametre dans une fonction js
    Par hellmaster78 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 19/06/2005, 14h35

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