2011-12-16 25 views
1

からOracle関数を呼び出します。私は、機能仕様を以下しているJavaの

 
FUNCTION FUNC_GET_SOMETHING_FROM_DATABASE (IN_parameter1   IN VARCHAR2, 
              IN_parameter2   IN VARCHAR2, 
              IN_parameter3   IN VARCHAR2, 
              IN_parameter4   IN VARCHAR2, 
              IN_parameter5   IN VARCHAR2, 
              IN_parameter6   IN VARCHAR2) 

RETURN REFCURTYP; 

に続いて、オラクルの関数を呼び出しているJavaでの私の方法です:

 
public List<SomeVO> getLogReport(
      String parameter1, String parameter2, String parameter3, 
      String parameter4, String parameter5, 
      String parameter6) throws BlahException, RemoteDataAccessException { 

     Vector<Object> params = new Vector<Object>(); 

     DataCollectionImpl<LogReportVO> someData = new DataCollectionImpl<LogReportVO>(
       LogReportVO.class); 

       // IN Parameters 

     params.add(parameter1); 
     params.add(parameter2); 
     params.add(parameter3); 
     params.add(parameter4); 
     params.add(parameter5); 
     params.add(parameter6); 


     //Out Parameter 
     params.add(new DBParameter(DBParameter.OUT, DBParameter.CURSOR)); 

     try { 
      callStoredProcedure(
        Constants.FUNC_GET_SOMETHING_FROM_DATABASE, params); 
     } catch (RemoteDataAccessException e) { 
      throw new BlahException("LogReportDAO", 
        "getLogReport", e.getMessage(), 
        e.getRealException()); 
     } 
     return someData.getDataCollectionObjects(); 
    } 

私は取得していますエラーは次のとおりです。

wrong number or types of arguments in call 

追加情報:

 
protected void callStoredProcedure(String procedureName, Vector params) throws RemoteDataAccessException { 
     callStoredProcedure(getSchema(), procedureName, params); 
    } 

    protected void callStoredProcedure(String schema, String procedureName, Vector params) throws RemoteDataAccessException { 
     callStoredProcedure(getDatasource(), schema, procedureName, params); 
    } 

    protected void callStoredProcedure(String dataSourceName, String schema, String procedureName, Vector params) throws RemoteDataAccessException { 
     getOracleConnection(dataSourceName).callStoredProcedure(
       getFullyQualifiedProcedureName(schema, procedureName), params); 
    } 

    private OracleConnection getOracleConnection(String datasource) { 
     OracleConnection oraConn = null; 
     try { 
      oraConn = new OracleConnection(datasource); 
     } catch (RemoteDataAccessException rdae) { 
      log.fatal("BaseDAO.getOracleConnection " + rdae.getMessage(), rdae); 
     } catch (Exception ie) {  
      log.fatal("BaseDAO.getOracleConnection" + ie.getMessage(), ie); 
     } 

     return oraConn; 
    } 

+0

は今までMybatis3のように、JDBCのラッパーを使用して考えます。複雑なタイプの作業をすると、作業が楽になります。 http://code.google.com/p/mybatis/ – Andy

+0

あなたは正しいですが、今は時間が重要なので、私はそれが可能と考えていません。私はOUTパラメータに問題があると思います。あなたはこれを回避する方法を知っていますか? – Bytekoder

+0

私は本当にありません。 MyBatisで可能なことはすべて知っています。 Outパラメータは、パラメータオブジェクトのフィールドに設定されます。申し訳ありませんが私はあなたのための答えを思い付くことができませんでした。 – Andy

答えて

1

おそらく、あなたのコードはストアドプロシージャの戻り値を考慮していない可能性があります。

代わりにストアドプロシージャを呼び出す標準のJDBC方法を使用しないのはなぜですか?それは魅力のように働く。

http://docs.oracle.com/javase/1.5.0/docs/guide/jdbc/getstart/callablestatement.html

+0

あなたのサポートのおかげで人々が、私はそれを働かせました。私はちょうどストアドプロシージャ内の関数を呼び出し、それは働いた。私は前にその考えを持っていたが、何らかの理由で私はもっと頑張っていないと思う。 – Bytekoder

+0

あなたは正しいですが、私たちは特定のデザインパターンを使用しており、違反したくありませんでした。その前に、テーブルオブジェクトを使用することになるかもしれないと誰も考えなかったので、直接関数呼び出しを容易にするようなユーティリティは公開されませんでした。 – Bytekoder

関連する問題