Получение неверной грамматической ошибки при вызове хранимой процедуры Spring с Java - PullRequest
1 голос
/ 21 июля 2011

Мне нужно отладить некоторый код, написанный кем-то другим, и я столкнулся с проблемой в одной из реализаций DAO. Мы используем Java 1.6 и Spring (я думаю, что в некоторых частях приложения есть какой-то переходящий в спящий режим, но не думаю, что они вступают в игру здесь.) Код, когда он запускается, выдает ошибку "outMap = super.execute (inMap) ;» строка кода. Выдает ошибку,

SystemErr R callHistorySP () org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; плохая грамматика SQL [{call DB2ADMIN / QUOTEACCESSORIALS (?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}]; вложенное исключение 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 выходных параметров. Вызываемый мной вызов имеет правильное количество параметров, и я не могу понять, что является причиной ошибки. Любая помощь будет принята с благодарностью. Я уверен, что проблема, вероятно, в чем-то простом, но я просто недостаточно хорошо знаю Spring, чтобы понять, что не так с этим кодом. Я не смог найти ответ в Google, как обычно. Спасибо!

Andrew

1 Ответ

1 голос
/ 21 июля 2011

Вы объявляете свои 40 параметров INOUT, используя SqlOutParameter . Поможет ли вам объявить их с помощью SqlInOutParameter вместо?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...