Hibernate Books

All times are UTC - 5 hours [ DST ]



Post new topic Reply to topic  [ 3 posts ] 
Author Message
 Post subject: [Résolu] Problème avec une procédure stockée
PostPosted: Thu Jan 12, 2012 7:28 am 
Newbie

Joined: Thu Jan 12, 2012 7:24 am
Posts: 3
Hello,

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:
   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;
   }


Un peu d'aide serait la bienvenue ;)


Last edited by Fabiz on Fri Jan 13, 2012 6:06 am, edited 2 times in total.

Top
 Profile  
 
 Post subject: Re: Problème avec une procédure stockée
PostPosted: Thu Jan 12, 2012 9:54 am 
Newbie

Joined: Thu Jan 12, 2012 7:24 am
Posts: 3
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:
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)


Top
 Profile  
 
 Post subject: Re: Problème avec une procédure stockée
PostPosted: Fri Jan 13, 2012 6:05 am 
Newbie

Joined: Thu Jan 12, 2012 7:24 am
Posts: 3
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:
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 ;)


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 3 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.