2012-01-12 198 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,這些參數必須聲明爲:

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 2013-08-02 17:29:53

回答

4

我也有同樣的問題。在我的情況下,我意識到我在調用存儲過程時忘記了「調用」這個詞。

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

這可以幫助別人有一天,誰知道......