Я не знаю, как мы можем помочь с проблемами производительности, не имея данных.Я вижу несколько небольших вещей в вашем коде, которые могут быть улучшены.
Вероятно, не влияет на производительность, потому что Oracle обрабатывает DUAL очень эффективно, но присваивает значение, а не использует select в.Это поможет с удобочитаемостью:
v_forecast_hr := get_da_value( l_var.hr_num, l_var.data_date, l_var.code );
v_prior_hour_value :=
get_prior_hour_value( l_var.hr_num
, l_var.data_date
, l_var.code
, l_var.form_field_tx );
v_prior_day_value :=
get_prior_day_value( l_var.hr_num
, l_var.data_date
, l_var.code
, l_var.form_field_tx );
Читаемость очень важна для устранения неисправностей.Ваш курсор , где предложение - беспорядок.Мне интересно, если вы обрабатываете больше записей, чем вы ожидали.Вы можете несколько улучшить читаемость, избавившись от лишних скобок, например, вокруг ваших поднаборов 'IN':
(flag_tx IN ('??', 'N'))
становится
flag_tx IN ('??', 'N')
Возможно, вы также захотите отформатировать свой код.Первым делом я бросил его в TOAD и запустил средство форматирования PL / SQL.Я сразу обнаружил, что вы пропустили точку с запятой после курсора, которая говорит мне, что код, который вы вставили здесь, не является реальным кодом, с которым вы работаете.Как показано здесь, это не скомпилируется.
Есть ли какая-то причина, которую вы фиксируете после каждого оператора обновления?Это не SQL Server, где блокировка является проблемой.Один коммит непосредственно перед
end loop;
- это все, что нужно.Если бы не тот факт, что это занимает несколько часов, я бы поместил один коммит за пределы цикла.