Ошибки компиляции при создании COMPOUND TRIGGER
Есть триггер:
CREATE OR REPLACE TRIGGER nx_check_number_pool_trg_test
for insert or update ON nx_number_pools
COMPOUND TRIGGER
t_pool_start number(12);
t_pool_end number(12);
BEFORE STATEMENT IS
begin
t_pool_start := :new.pool_start;
t_pool_end := :new.pool_end;
end;
END BEFORE STATEMENT;
before EACH ROW IS
begin
for rec in (select pool_start, pool_end, nbpl_id from NX_NUMBER_POOLS) loop
if (t_pool_start between rec.pool_start and rec.pool_end) then
raise_application_error(-20000,
' Начало пула не должно пересекаться с диапозоном значений другого. ' ||
rec.nbpl_id);
end if;
if (t_pool_end between rec.pool_start and rec.pool_end) then
raise_application_error(-20000,
' Конец пула не должен пересекаться с диапозоном значений другого. ' ||
rec.nbpl_id);
end if;
end loop;
end;
END before EACH ROW;
END nx_check_number_pool_trg_test;
Получаю ошибку:
Compilation errors for TRIGGER BIS.NX_CHECK_NUMBER_POOL_TRG_TEST
Error: PLS-00103: Encountered the symbol ";" when expecting one of the following:
before after
Line: 18
Text: if (t_pool_start between rec.pool_start and rec.pool_end) then
Можете сказать что я не так делаю?
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
Вот рабочее решение, как было задумано в вопросе:
create table nx_number_pools (nbpl_id number, pool_start number, pool_end number);
create or replace type poolRow force is object (nbpl_id number, pool_start number, pool_end number)
/
create or replace type poolRows is table of poolRow
/
create or replace trigger nx_check_number_pool_trg_test for insert or update on nx_number_pools compound trigger
pools poolRows := poolRows ();
before each row is begin
pools.extend;
pools(pools.last) := poolRow (:new.nbpl_id, :new.pool_start, :new.pool_end);
end before each row;
after statement is
begin
for r in (
select /*+ first_rows(1) */
n.nbpl_id nid, n.pool_start ns, n.pool_end ne, o.nbpl_id oid, o.pool_start os, o.pool_end oe
from table (pools) n
join nx_number_pools o on ((
n.pool_start between o.pool_start and o.pool_end or
n.pool_end between o.pool_start and o.pool_end) and o.nbpl_id != n.nbpl_id)) loop
raise_application_error (-20000,
'Начало/Конец пула не должен пересекаться с другим диапозоном (new=>old='||
r.nid||'/'||r.ns||'/'||r.ne||'=>'||r.oid||'/'||r.os||'/'||r.oe||')');
end loop;
end after statement;
end;
/
Проверить как работает так:
insert into nx_number_pools values (1, 10, 20);
1 row inserted.
insert into nx_number_pools values (2, 21, 30);
1 row inserted.
insert into nx_number_pools values (3, 15, 25);
ORA-20000: Начало/Конец пула не должен пересекаться с другим диапозоном (new=>old=3/15/25=>1/10/20)
PS Пример служит только для изучения концепции триггеров. Применение в продуктивной среде не рекомендуется, так как триггер для решения данной задачи не нужен.