På grund af løkken (som mangler en exit-klausul - forhåbentlig har du lige mistet det ved at oversætte dette til et spørgsmål) vil du forsøge at indsætte en post i pstn_matrix
for hver optag markørens returnering, om der er nogen matchende :new.person_id
eller ikke; og hvis der er match, skal du også foretage update
. Hvilket sandsynligvis ikke er, hvad du ønsker, og du kan blandt andet få en overtrædelse af begrænsningen. Du sætter heller ikke dit tællerfelt - hvis det ikke er nullbart, vil det fejle. Men du har ikke sagt, hvilke fejl, hvis nogen, du får.
Hvis du skal gøre dette gennem en trigger, kan du enten tjekke, om der overhovedet er en række til den nye person:
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 brug merge
.
Men jeg kan ikke lide denne model, og du opsætter potentialet for data-uoverensstemmelser med samtidige ændringer af basistabellen. At forsøge at opretholde en optælling som denne er ikke nødvendigvis så simpel, som det ser ud til.
Jeg foretrækker normalt at gøre dette til en visning, som altid vil være opdateret og ikke behøver den udløser, der komplicerer tingene:
create view postn_matrix as
select person_id, count(*)
from basetable
group by person_id;
Selvfølgelig kan jeg misfortolke eller overforenkle, hvad dine basistabeller gør, og hvad du har brug for postn_matrix
til. Det virker lidt trivielt at have selv som udsigt. Hvis du har en separat person
og person_position
tabeller, for eksempel, så kan du tilføje en ydre joinforbindelse for at se personer uden 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;