Précédent   Forum des professionnels en informatique > 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 Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/01/2012, 15h27   #1
Invité de passage
 
Homme Fabrizio Leonardo
Développeur Web
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Fabrizio Leonardo
Âge : 24
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : Finance

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 1
Points : 1
Par défaut Appel de procédure stockée

Hello,

J'avais posté ce post dans la partie Hibernate du forum mais je pense en fin de compte qu'il s'agit plus d'un problème avec JDBC.
Hibernate me permet, dans ce cas-ci, de faire appel à JDBC grâce à l'objet Connection.


J'ai quelques soucis en ce qui concerne l'appel d'une stored procedure sur une base de donnée Oracle.

Il existe dans ma DB une procédure prenant en compte une cinquantaine de paramètres en entrée et 2 valeurs de retour (en fait les 2 derniers paramètres sont en INOUT).

J'essaie tant bien que mal d'exécuter cette procédure mais sans succès.
Une NullPointerException apparait lors de l'appel à transaction.execute().

Etant complètement novice, je ne vois pas du tout d'où cela pourrait venir. Il me semble que la procédure est effectivement trouvée car lorsque je retire des paramètres, une exception apparait indiquant que le nombre de paramètres est faux.

Voici le code:

Code :
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
49
50
51
52
53
54
55
 
	public boolean add(ProductSpecs productSpecs) {
		Session session = (Session) HibernateUtil.currentSession();
		final Transaction transaction = session.beginTransaction();
 
		try {
			session.doWork(new Work() {
 
				public void execute(Connection connection) throws SQLException {
					try {
						CallableStatement call = connection.prepareCall("{?, ? = call bksgnvcrm.createorreturnproduct1nc(" +
								"?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?," +
								"?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, " +
								"?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) }");
 
						call.registerOutParameter(1, OracleTypes.INTEGER);
						call.registerOutParameter(2, OracleTypes.VARCHAR);
 
						int i = 3;
 
						call.setString(i++, typeofproduct);
						call.setString(i++, shiptositenumber);
						call.setString(i++, billtositenumber);
						call.setString(i++, ordernumber);
						call.setInt(i++, orderid);
						call.setString(i++, customerorderreference);
						call.setString(i++, productreference);
 
					        ...
 
						call.setString(i++, servicerequestnumber);
						call.setString(i++, reasoncode);
						call.setString(i++, cpsname);
						call.setString(i++, flexibilityflag);
						call.setInt(i++, errcode);
						call.setString(i++, errmsg);
 
						call.execute(); ------> NullPointerException
 
						System.out.println("err_code: " + call.getString(1));
						System.out.println("err_msg: " + call.getString(2));
						transaction.commit();
					} catch (SQLException e) {
						throw new SQLException(e);
					}
				}
			});
		} catch (Exception e) {
			e.printStackTrace();
			transaction.rollback();
			return false;
		}
 
		return true;
	}

Pour la précision, le driver ojdbc utilisé est le suivant: 11.2.0.2.0.
Voici une partie de l'exception reçue:

Code :
1
2
3
4
5
6
7
8
 
java.lang.NullPointerException
	at oracle.jdbc.driver.T4C8Oall.getNumRows(T4C8Oall.java:977)
	at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:1363)
	at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1709)
	at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:4364)
	at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:4445)
	at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:6268)
Un peu d'aide serait la bienvenue
Fabiz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 16h29   #2
Membre Expert
 
Homme
Développeur java, access, sql server
Inscription : octobre 2005
Messages : 851
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Développeur java, access, sql server
Secteur : Industrie

Informations forums :
Inscription : octobre 2005
Messages : 851
Points : 1 302
Points : 1 302
à première vue, un des paramètres est null
fait un System.out.println sur chaque paramètre pour voir
__________________
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser.
First, make it work. Then, make it fast. Finally, make it user-friendly.
Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich.
Népomucène est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 16h59   #3
Invité de passage
 
Homme Fabrizio Leonardo
Développeur Web
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Fabrizio Leonardo
Âge : 24
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : Finance

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 1
Points : 1
Il y avait un effectivement un paramètre que je n'avais pas initialisé mais cela n'a pas résolu mon souci

La plupart des paramètres sont des VARCHAR (String) que je dois initialiser à "" (chaîne vide), j'imagine que ce n'est pas la cause du problème ?
Fabiz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 17h16   #4
Membre Expert
 
Homme
Développeur java, access, sql server
Inscription : octobre 2005
Messages : 851
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Développeur java, access, sql server
Secteur : Industrie

Informations forums :
Inscription : octobre 2005
Messages : 851
Points : 1 302
Points : 1 302
Bon, je ne connais pas Oracle, mais je vois que la ligne qui déclenche le problème est "oracle.jdbc.driver.T4CCallableStatement.getNumRows"
Il est possible qu'il y ai un problème de nombre de lignes exécutées/retournées.

Essaye la procédure en dehors de java pour s'assurer qu'elle fonctionne bien
avec exactement les mêmes paramètres
__________________
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser.
First, make it work. Then, make it fast. Finally, make it user-friendly.
Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich.
Népomucène est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 11h05   #5
Invité de passage
 
Homme Fabrizio Leonardo
Développeur Web
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Fabrizio Leonardo
Âge : 24
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : Finance

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 1
Points : 1
Après des heures et des heures où je suis tourné en rond, voilà là solution !

La procédure possédait les 2 derniers paramètres comme étant IN OUT.

Il ne faut donc pas les gérer comme des paramètres OUT (comme je le croyais).

Récupérer des paramètres OUT reviendrait à faire:
Code :
CallableStatement call = connection.prepareCall("{?, ? = call bksgnvcrm.createorreturnproduct1nc(..., ?, ?)}");
Mais étant des paramètres IN OUT, il ne faut pas les déclarer en OUT dans le call:
Code :
CallableStatement call = connection.prepareCall("{call bksgnvcrm.createorreturnproduct1nc(..., ?, ?)}");
Et enfin les enregistrer comme paramètres OUT également comme ceci:

Code :
1
2
3
4
call.registerOutParameter(i, Types.INTEGER);
call.setInt(i++, errcode);
call.registerOutParameter(i, Types.VARCHAR);
call.setString(i++, errmsg);

J'espère que ceci pourra aider d'autres personnes
Fabiz est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h20.


 
 
 
 
Partenaires

Hébergement Web