På grund av slingan (som saknar en exit-klausul - förhoppningsvis har du precis tappat bort att översätta detta till en fråga) kommer du att försöka infoga en post i pstn_matrix
för varje spela in markörreturerna, om det finns några matchande :new.person_id
eller inte; och om det finns matchning kommer du också att göra update
. Vilket förmodligen inte är vad du vill, och du kan bland annat få en överträdelse av begränsningen. Du ställer inte heller in ditt räknarfält - om det inte är nullbart kommer det att felas. Men du har inte sagt vilka fel, om några, du får.
Om du måste göra detta genom en trigger kan du antingen kontrollera om det finns en rad för den nya personen överhuvudtaget:
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;
...
... eller använd merge
.
Men jag gillar inte den här modellen, och du skapar risken för dataavvikelser med samtidiga modifieringar av bastabellen. Att försöka behålla en sådan här räkning är inte nödvändigtvis så enkelt som det verkar.
Jag föredrar vanligtvis att göra det här till en vy som alltid kommer att vara uppdaterad och som inte behöver triggern som komplicerar saker:
create view postn_matrix as
select person_id, count(*)
from basetable
group by person_id;
Naturligtvis kan jag misstolka eller överförenkla vad din bastabell gör och vad du behöver postn_matrix
för. Det verkar lite trivialt att ha ens som utsikt. Om du har en separat person
och person_position
tabeller, säg, då kan du lägga till en yttre sammanfogning för att se personer utan positioner:
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;