2012-01-12 95 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(?,?,?,?) }" 

这可以帮助别人有一天,谁知道......