2011-07-21 3 views
1

他の人が書いたコードをデバッグする必要があり、DAOの実装の1つで問題が発生しました。私たちはJava 1.6とSpringを使用しています(アプリケーションのいくつかの部分でいくつかの休止状態があると思いますが、ここでは動作しないと思います)。実行時のコードは、 "outMap = super.execute(inMap) ; "コード行それはスローエラーがJavaでSpringストアドプロシージャを呼び出すときに不正な文法エラーが発生する

SystemErr R callHistorySP()である org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback。不正なSQL文法[{ DB2ADMIN/QUOTEACCESSORIALS()を呼び出すと、 「?」、「?」、「?」、「?」、「?」、「?」、「0」、「0」、「0」、 、?、?))]];および[ネストされた例外は です。java.sql.SQLException:登録されたパラメータ値の数または がパラメータの数と一致しません。

ここにオブジェクト(少なくとも関連する部分)があります。

private class RateQuoteHistoryStoredProc extends StoredProcedure { 
    private final String SQL = getStoredProcName(); 
    private final String QUOTE_NUM = "rateQuoteNumber", 
     ACCESSORIAL = "accessorial", 
     ACCESSORIAL_AMT = "accessorialAmt", 
       FAKRATEHISTORY = "fakRateHistory", 
       HANDLING_UNITS = "numHandlingUnits", 
       PIECES = "numPieces", 
       CUBIC_FEET = "cubicFeet", 
       BUNKER_FUEL_SURCHARGE = "puertoRicoBunkerFuel", 
       CANADIAN_BORDER_FEE = "canadaCrossBorderFee" , 
       TX_ARBITRARY_CHARGE = "texasArbitraryChg" , 
       WASHINGTON_DC_CHARGE = "washingtonDCArbitraryChg", 
       NYC_CHARGE = "nycArbitraryChg" , 
       NORTHERN_VIRGINIA_CHARGE = "northVirginiaArbitraryChg" , 
       FLORIDA_ARBITRARY_CHARGE = "flKeysArbitraryChg" , 
       FERRY_CHARGE ="ferryCharge"; 


    private Map outMap = new HashMap(); 


    public RateQuoteHistoryStoredProc(DataSource ds){ 
     try { 
      setDataSource(ds); 
      setSql(SQL); 
      declareParameter(new SqlParameter(QUOTE_NUM, Types.DECIMAL)); 
      for (int i = 0; i < getMAX_ACCESSORIALS(); i++) { 
       declareParameter(new SqlOutParameter(ACCESSORIAL + i, Types.CHAR)); 
      } 
      for (int i = 0; i < getMAX_ACCESSORIALS(); i++) { 
       declareParameter(new SqlOutParameter(ACCESSORIAL_AMT + i, Types.DECIMAL)); 
      } 
        declareParameter(new SqlOutParameter(FAKRATEHISTORY, Types.CHAR)); 
        declareParameter(new SqlOutParameter(HANDLING_UNITS, Types.DECIMAL)); 
        declareParameter(new SqlOutParameter(PIECES, Types.DECIMAL)); 
        declareParameter(new SqlOutParameter(CUBIC_FEET, Types.DECIMAL)); 
        declareParameter(new SqlOutParameter(BUNKER_FUEL_SURCHARGE, Types.DECIMAL)); 
       declareParameter(new SqlOutParameter(CANADIAN_BORDER_FEE, Types.DECIMAL)); 
        declareParameter(new SqlOutParameter(TX_ARBITRARY_CHARGE, Types.DECIMAL)); 
        declareParameter(new SqlOutParameter(WASHINGTON_DC_CHARGE, Types.DECIMAL)); 
        declareParameter(new SqlOutParameter(NYC_CHARGE, Types.DECIMAL)); 
        declareParameter(new SqlOutParameter(NORTHERN_VIRGINIA_CHARGE, Types.DECIMAL)); 
        declareParameter(new SqlOutParameter(FLORIDA_ARBITRARY_CHARGE, Types.DECIMAL)); 
        declareParameter(new SqlOutParameter(FERRY_CHARGE, Types.DECIMAL)); 
      compile(); 
     } 
     catch (Exception e) { 
      log.error("RateQuoteStoredProc()",e); 
     } 
    } 

    public void callHistorySP(LTLCustomRatesBean bean) throws Exception { 
     HashMap inMap = new HashMap(); 
     inMap.put(QUOTE_NUM, bean.getRateQuoteNumber()); 

     for(int i = 0; i < getMAX_ACCESSORIALS(); i++){ 
      inMap.put(ACCESSORIAL+i, " "); 
     } 

     for(int i = 0; i < getMAX_ACCESSORIALS(); i++){ 
      inMap.put(ACCESSORIAL_AMT+i, "0"); 
     } 

     try 
     { 
      outMap = super.execute(inMap); 
     } 
     catch (NullPointerException npe){ 
      if(bean.getCustomer() == null){ 
       log.error("callHistorySP() Customer is null"); 
      }else{ 
       log.error("callHistorySP()",npe); 
      } 
     } 
     catch (Exception e) { 
      log.error("callSP()",e); 
     } 
     if (isDebugMode()) { 
      log.debug("callSP(): outMap: "+outMap); 
     } 
     saveResults(outMap, bean); 
    } 

} 

これは、呼び出し元のストアドプロシージャです。

CREATE PROCEDURE DB2ADMIN.QUOTEACCESSORIALS ( 
    IN QUOTENUM DECIMAL(7, 0) , 
    INOUT ACCCD1 CHAR(6) , 
    INOUT ACCCD2 CHAR(6) , 
    INOUT ACCCD3 CHAR(6) , 
    INOUT ACCCD4 CHAR(6) , 
    INOUT ACCCD5 CHAR(6) , 
    INOUT ACCCD6 CHAR(6) , 
    INOUT ACCCD7 CHAR(6) , 
    INOUT ACCCD8 CHAR(6) , 
    INOUT ACCCD9 CHAR(6) , 
    INOUT ACCCD10 CHAR(6) , 
    INOUT ACCCD11 CHAR(6) , 
    INOUT ACCCD12 CHAR(6) , 
    INOUT ACCCD13 CHAR(6) , 
    INOUT ACCCD14 CHAR(6) , 
    INOUT ACCCD15 CHAR(6) , 
    INOUT ACCCD16 CHAR(6) , 
    INOUT ACCCD17 CHAR(6) , 
    INOUT ACCCD18 CHAR(6) , 
    INOUT ACCCD19 CHAR(6) , 
    INOUT ACCCD20 CHAR(6) , 
    INOUT ACCAM1 DECIMAL(9, 2) , 
    INOUT ACCAM2 DECIMAL(9, 2) , 
    INOUT ACCAM3 DECIMAL(9, 2) , 
    INOUT ACCAM4 DECIMAL(9, 2) , 
    INOUT ACCAM5 DECIMAL(9, 2) , 
    INOUT ACCAM6 DECIMAL(9, 2) , 
    INOUT ACCAM7 DECIMAL(9, 2) , 
    INOUT ACCAM8 DECIMAL(9, 2) , 
    INOUT ACCAM9 DECIMAL(9, 2) , 
    INOUT ACCAM10 DECIMAL(9, 2) , 
    INOUT ACCAM11 DECIMAL(9, 2) , 
    INOUT ACCAM12 DECIMAL(9, 2) , 
    INOUT ACCAM13 DECIMAL(9, 2) , 
    INOUT ACCAM14 DECIMAL(9, 2) , 
    INOUT ACCAM15 DECIMAL(9, 2) , 
    INOUT ACCAM16 DECIMAL(9, 2) , 
    INOUT ACCAM17 DECIMAL(9, 2) , 
    INOUT ACCAM18 DECIMAL(9, 2) , 
    INOUT ACCAM19 DECIMAL(9, 2) , 
    INOUT ACCAM20 DECIMAL(9, 2) , 
    OUT FAKRATEHISTORY CHAR(20) , 
    OUT HANDLING_UNIT DECIMAL(5, 0) , 
    OUT PIECES DECIMAL(5, 0) , 
    OUT CUBIC_FEET DECIMAL(5, 0) , 
    OUT BUNKER_FUEL_SURCHARGE DECIMAL(9, 2) , 
    OUT CANADIAN_BORDER_FEE DECIMAL(9, 2) , 
    OUT TX_ARBITRARY_CHARGE DECIMAL(9, 2) , 
    OUT WASHINGTON_DC_CHARGE DECIMAL(9, 2) , 
    OUT NYC_CHARGE DECIMAL(9, 2) , 
    OUT NORTHERN_VIRGINIA_CHARGE DECIMAL(9, 2) , 
    OUT FLORIDA_ARBITRARY_CHARGE DECIMAL(9, 2) , 
    OUT FERRY_CHARGE DECIMAL(9, 2)) 
    LANGUAGE RPG 
    SPECIFIC DB2ADMIN.QUOTEACCESSORIALS 
    NOT DETERMINISTIC 
    MODIFIES SQL DATA 
    CALLED ON NULL INPUT 
    EXTERNAL NAME 'LTL400AVX2/WW7R010' 
    PARAMETER STYLE GENERAL ; 

SPには53のパラメータがあります。 1つの入力パラメーター、40の入出力パラメーター、12の出力パラメーターを持っています。私が作っているコールは正しい数のパラメータを持っているようだし、エラーの原因を突き止めることはできません。どんな助けでも大歓迎です。私はこの問題はおそらく単純なものだと確信していますが、私はちょうどこのコードで何が間違っているかを見るために十分に春を知らない。私はGoogleに通常のように答えを出すことができませんでした。ありがとう!

アンドリュー

答えて

1

あなたはSqlOutParameterを使用して、40個のINOUTパラメータを宣言しています。代わりにSqlInOutParameterを使って宣言すれば助けになりますか?

+1

あなたは天才です!私はあなたの後に11月に持っている子供の名前をつけています。 –

関連する問題