2012-01-12 4 views
4

У меня возникли проблемы с хранимой процедурой в базе данных Oracle.JDBC Вызов хранимой процедуры возвращает null

Я просто хочу вызвать процедуру (которая имеет параметры 50 IN и 2 IN OUT) и получить эти 2 OUT-параметра.

Я пытаюсь выполнить() соответствующий CallableStatement но он возвращает мне NullPointerException

java.lang.NullPointerException 
at oracle.jdbc.driver.T4C8Oall.getNumRows(T4C8Oall.java:977) 
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:1363) 
... 

Вот код (я использую Hibernate):

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 geneva_admin.bksgnvcrmps.createorreturnproduct1nc(" + 
          "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?," + 
          "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?," + 
          "?,?,?,?,?,?,?,?,?,?,?,?)}"); 

        int i = 1; 

        call.registerOutParameter(i++, Types.INTEGER); 
        call.registerOutParameter(i++, Types.VARCHAR); 


        call.setString(i++, typeofproduct); 
        call.setString(i++, shiptositenumber); 
        call.setString(i++, billtositenumber); 
        call.setString(i++, ordernumber); 
        call.setInt(i++, orderid); 
        ... 
        call.setInt(i++, errcode); 
        call.setString(i++, errmsg); 

        call.execute(); 

        System.out.println("err_code: " + call.getString(1)); 
        System.out.println("err_msg: " + call.getString(2)); 

        call.close(); 
        transaction.commit(); 
       } catch (SQLException e) { 
        throw new SQLException(e); 
       } 
      } 
     }); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     transaction.rollback(); 
     return false; 
    } 

Если до выполнить(), я установил

call.setEscapeProcessing(false); 

у меня SQLSyntaxErrorException (ORA-00911: недопустимый символ)

Не могли бы вы мне помочь?

Fab


Вот решение:

В последние 2 параметры процедуры являются IN OUT. Я думал, что мы должны были управлять ими в качестве параметра OUT:

CallableStatement call = connection.prepareCall("{?, ? = call bksgnvcrm.createorreturnproduct1nc(..., ?, ?)}"); 

Но они IN OUT, эти параметры должны быть объявлены как IN:

CallableStatement call = connection.prepareCall("{call bksgnvcrm.createorreturnproduct1nc(..., ?, ?)}"); 

И, наконец, зарегистрировать их как OUT как это:

call.registerOutParameter(i, Types.INTEGER); 
call.setInt(i++, errcode); 
call.registerOutParameter(i, Types.VARCHAR); 
call.setString(i++, errmsg); 

Я надеюсь, что это может помочь вам :)

+0

{?,? = call bksgnvcrm - Что это? Вы не можете вернуть два результата вызова функции. – OldProgrammer

ответ

4

I также была та же проблема. В моем случае я понял, что забыл слово «звонок» при вызове хранимой процедуры.

"{ call myPackage.myProcedure(?,?,?,?) }" 

Это может помочь кому-то еще один день, кто знает ...

Смежные вопросы