Kvůli smyčce (ve které chybí výstupní klauzule - doufejme, že jste to ztratili, když jste to převedli na otázku) se pokusíte vložit záznam do pstn_matrix
pro každý zaznamenejte návrat kurzoru, zda existují nějaké odpovídající :new.person_id
nebo ne; a pokud existuje shoda, provedete také update
. Což pravděpodobně není to, co chcete, a mimo jiné můžete získat porušení omezení. Nenastavujete také pole počítadla – pokud toto pole nelze použít, dojde k chybě. Ale neřekli jste, jaké chyby, pokud nějaké, dostáváte.
Pokud to musíte udělat prostřednictvím spouštěče, můžete buď zkontrolovat, zda vůbec existuje řádek pro novou osobu:
DECLARE
v_temp postn_matrix.person_id%TYPE;
BEGIN
IF INSERTING THEN
select max(person_id) into v_temp
from postn_matrix
where person_id = :new.person_id;
if v_temp is null then
-- no record found, so insert one
insert into postn_matrix (person_id, position_count)
values (:new.person_id, 1);
else
-- record exists, so update
update postn_matrix ...
end if;
...
... nebo použijte merge
.
Ale tento model se mi nelíbí a vy vytváříte potenciál pro nesrovnalosti v datech souběžnými úpravami základní tabulky. Snažit se udržet počet, jako je tento, není nutně tak jednoduché, jak se zdá.
Obvykle bych dal přednost tomu, aby to bylo zobrazení, které bude vždy aktuální a nepotřebuje spouštěč, který věci komplikuje:
create view postn_matrix as
select person_id, count(*)
from basetable
group by person_id;
Samozřejmě si možná špatně vykládám nebo příliš zjednodušuji, co vaše základní tabulka(y) dělá a co potřebujete postn_matrix
pro. Zdá se to trochu triviální mít i jako pohled. Pokud máte samostatnou person
a person_position
řekněme tabulky, pak můžete přidat vnější spojení, abyste viděli lidi bez pozic:
create view postn_matrix as
select p.person_id, count(pp.position_id)
from person p
left join person_position pp on pp.person_id = p.person_id
group by p.person_id;