Это означает, что вы пытаетесь получить доступ к индексу массива, который недопустим, поскольку он не находится между границами.
Например, это инициализировало бы примитивный целочисленный массив с верхней границей 4 .
int intArray[] = new int[5];
Программисты подсчитываются с нуля. Таким образом, это, например, выбрало бы ArrayIndexOutOfBoundsException
, поскольку верхняя граница равна 4, а не 5.
intArray[5];
Запрос, вызвавший проблему: SELECT TOTAL_PRFT / NO_OF_INSTALLMENT FROM InsightSource.BS.IS_H_LD_SCHEDULE
. Он должен возвращать только одну строку данных, ваш возвращает несколько.
Здесь есть две проблемы:
1 - та, которую вы указали в своем вопросе: подзапрос может вернуть более 1 результата. Вам нужно установить «определитель», к которому данные вы хотите. Например: если ваша таблица выглядит примерно так:
ID Total_prft No_Of_Installment
1 15 3
2 20 5
Тогда вы можете сделать так: SELECT TOTAL_PRFT / NO_OF_INSTALLMENT FROM InsightSource.BS.IS_H_LD_SCHEDULE WHERE ID = @ID
, где @ID - это предопределенная переменная (возможно, вы можете получить ее из таблицы GL) .
Или, как рекомендует @Suraj Kumar, вы также можете использовать ключевое слово TOP 1
, если оно работает для вас.
2- Другая проблема заключается в том, что вы не проверяете, является ли No_OF_Installment нулевым или нулевым, что приведет к ошибке деления. Пожалуйста, добавьте чек, добавив что-то вроде:
WHEN LDContractType = 'AMORT' THEN (
case when NO_OF_INSTALLMENT IS NOT NULL AND NO_OF_INSTALLMENT > 0
THEN SELECT TOTAL_PRFT / NO_OF_INSTALLMENT FROM InsightSource.BS.IS_H_LD_SCHEDULE
ELSE 0
END)
...