Я пытаюсь проверить разницу между ценностями или нет. Позвольте мне объяснить с коротким сценарием.
Re c 1: Компания AA: Разрыв расстояния -> 100 - 200
Re c 2: Компания AA: Разрыв расстояния -> 200 - 300 ДЕЙСТВИТЕЛЬНО
Re c 3: Компания AA: Разрыв расстояния -> 250 - 450 Недействительно
Re c 4: Компания JL: Разрыв расстояния -> 250 - 450 VALID
Re c 3 Неправильно, потому что оно находится между значениями расстояния RE C 2. Re c 4 Действителен, потому что компания отличается
Таким образом, я написал триггер, чтобы предотвратить это.
create or replace trigger ab_redemption_billing_mpr
after insert or update on redemption_billing_mpr
for each row
declare
v_is_distance_range_valid boolean;
begin
v_is_distance_range_valid := p_redemption_billing.is_distance_range_valid(:new.id,
:new.redemption_billing_company,
:new.distance_min,
:new.distance_max,
'redemption_billing_mpr');
if not v_is_distance_range_valid then
raise_application_error(-20001, 'This is a custom error');
end if;
end ab_redemption_billing_mpr;
ФУНКЦИЯ:
function is_distance_range_valid(p_id in number,
p_company in varchar2,
p_distance_min in number,
p_distance_max in number,
p_table_name in varchar2) return boolean is
d_record_number number;
begin
execute immediate 'select count(*) from ' || p_table_name || ' r
where r.redemption_billing_company = :1
and (:2 between r.distance_min and r.distance_max or :3 between r.distance_min and r.distance_max)
and r.id = nvl(:4, id)'
into d_record_number
using p_company, p_distance_min, p_distance_max, p_id;
if (d_record_number > 0) then
return false;
else
return true;
end if;
end;
is_distance_range_valid()
работает так, как я ожидал. Если он возвращает false, это означает, что проверка диапазона недопустима и не вставляется и не обновляется.
Когда я создаю сценарий для перехвата этого исключения, oracle дает
ORA -04091: имя таблицы меняется, триггер / функция может его не видеть
и оно указывает select count(*)
строку, когда я нажимаю кнопку отладки.
Я не знаю, почему я Я получаю эту ошибку. Заранее спасибо.