Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Invité régulier
    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 : 6
    Points
    6

    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 :
    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 :
    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 Mihaela
    Inscrit en
    novembre 2008
    Messages
    806
    Détails du profil
    Informations personnelles :
    Nom : Femme Mihaela
    Localisation : Belgique

    Informations forums :
    Inscription : novembre 2008
    Messages : 806
    Points : 3 082
    Points
    3 082

    Par défaut

    Bonjour,

    La synthaxe
    Code :
    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 :
    1
    2
     
    System.out.print("/'/" + variableString + "/'/");
    si tu tiens vraiment à tes simple quotes ou

    Code :
    1
    2
     
    System.out.print(variableString);
    Chaque fois que tu dis "je ne peux pas", n'oublie pas d'ajouter le mot "encore".
    Documentation PrimeFaces

  3. #3
    Invité régulier
    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 : 6
    Points
    6

    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 Confirmé Sénior
    Avatar de tchize_
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    avril 2007
    Messages
    21 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Service public

    Informations forums :
    Inscription : avril 2007
    Messages : 21 580
    Points : 38 427
    Points
    38 427

    Par défaut

    Citation Envoyé par Mishulyna Voir le message
    Bonjour,

    La synthaxe
    Code :
    1
    2
     
    System.out.print("'" + variableString + "'");
    donne une erreur en Java.
    Pardon?


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


    Code :
    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.
    Tchize (Чиз) faq java, cours java, javadoc. Pensez à et
    Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.

  5. #5
    Invité régulier
    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 : 6
    Points
    6

    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 Mihaela
    Inscrit en
    novembre 2008
    Messages
    806
    Détails du profil
    Informations personnelles :
    Nom : Femme Mihaela
    Localisation : Belgique

    Informations forums :
    Inscription : novembre 2008
    Messages : 806
    Points : 3 082
    Points
    3 082

    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".
    Documentation PrimeFaces

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •