Précédent   Forum du club des développeurs et IT Pro > Java > Général Java > JDBC
JDBC Forum d'entraide sur l'API JDBC (Java Database Connectivity) et l'accès aux bases de données. Avant de poster -> FAQ JDBC
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 23/11/2012, 10h51   #1
Koerty
Invité régulier
 
Homme
Étudiant
Inscription : 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 :

Citation:
'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.
Koerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2012, 15h59   #2
Mishulyna
Membre habitué
 
Femme
Inscription : novembre 2008
Messages : 124
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Belgique

Informations forums :
Inscription : novembre 2008
Messages : 124
Points : 133
Points : 133
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);
__________________
Mieux vaut aller seul quelque part que nulle part à plusieurs.
Mishulyna est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2012, 10h39   #3
Koerty
Invité régulier
 
Homme
Étudiant
Inscription : 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
Citation:
Envoyé par Mishulyna Voir le message
Bonjour,

...
Merci pour votre réponse, malheureusement, cela n'a rien changé.
Koerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2012, 10h54   #4
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 412
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

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

Informations forums :
Inscription : avril 2007
Messages : 18 412
Points : 33 153
Points : 33 153
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
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.
__________________
⥀⥁ Чиз 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.
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2012, 11h27   #5
Koerty
Invité régulier
 
Homme
Étudiant
Inscription : 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
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é :
Citation:
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.
Koerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2012, 19h21   #6
Mishulyna
Membre habitué
 
Femme
Inscription : novembre 2008
Messages : 124
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Belgique

Informations forums :
Inscription : novembre 2008
Messages : 124
Points : 133
Points : 133
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?
__________________
Mieux vaut aller seul quelque part que nulle part à plusieurs.
Mishulyna est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 12h37.


 
 
 
 
Partenaires

Hébergement Web