2012-01-12 23 views
4

Oracleデータベースのストアド・プロシージャにいくつか問題があります。JDBCストアド・プロシージャへのコールでNULLが返される

プロシージャ(50個のINパラメータと2個のIN OUTパラメータがあります)を呼び出し、これらの2つのOUTパラメータを取得するだけです。

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

場合は、前:

I)が(関連付けられたCallableStatementを実行しようとしているが、それは私にNullPointerExceptionがここ

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

を返しますが(私は休止状態を使用しています)のコードです()を実行、私はSQLSyntaxErrorException(:無効な文字ORA-00911)を持っている

call.setEscapeProcessing(false); 

を設定しました

お手伝いできますか?手順の

2つの最後のパラメータがOUTにあります。ここでのFab


は、ソリューションです。 私たちはOUTパラメータとしてそれらを管理しなければならなかったことを考えた:

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

しかし、彼らは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

...知っている他の誰か1日を、助けるかもしれませんか?、? =コールbksgnvcrm - それは何ですか?あなたは関数呼び出しから2つの結果を返すことはできません。 – OldProgrammer

答えて

4

私はまた、同じ問題がありました。私の場合は、ストアドプロシージャを呼び出すときに「呼び出し」という単語を忘れてしまったことに気付きました。

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

これは、{

関連する問題