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 :

Appel de procédure stockée


Sujet :

JDBC Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Java Developer
    Inscrit en
    Septembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Java Developer
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2011
    Messages : 5
    Points : 5
    Points
    5
    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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    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 : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    à première vue, un des paramètres est null
    fait un System.out.println sur chaque paramètre pour voir
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Java Developer
    Inscrit en
    Septembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Java Developer
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2011
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    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 ?

  4. #4
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    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 : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    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
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Java Developer
    Inscrit en
    Septembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Java Developer
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2011
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    CallableStatement call = connection.prepareCall("{call bksgnvcrm.createorreturnproduct1nc(..., ?, ?)}");
    Et enfin les enregistrer comme paramètres OUT également comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/02/2006, 00h11
  2. Réponses: 3
    Dernier message: 17/01/2006, 17h12
  3. Update appelant une procédure stockées
    Par meufeu dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 06/10/2005, 18h31
  4. [appeler une procédure stockée]
    Par viny dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 10/03/2005, 22h38
  5. Appel de Procédure stockée en ASP
    Par James85 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 14/11/2004, 17h55

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