Мне нужно отладить некоторый код, написанный кем-то другим, и я столкнулся с проблемой в одной из реализаций 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