Заради цикъла (в който липсва клауза за изход - да се надяваме, че току-що сте го загубили, превръщайки това във въпрос) ще се опитате да вмъкнете запис в pstn_matrix
за всеки запишете връщането на курсора, дали има съответстващи :new.person_id
или не; и ако има съвпадение, ще направите и update
. Което вероятно не е това, което искате, и може да получите нарушение на ограничението, наред с други неща. Вие също не настройвате своето поле за брояч - ако това не е nullable, това ще доведе до грешка. Но не сте казали какви грешки, ако има такива, получавате.
Ако трябва да направите това чрез тригер, можете или да проверите дали изобщо има ред за новия човек:
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;
...
... или използвайте merge
.
Но не харесвам този модел и вие настройвате потенциала за несъответствия в данните с едновременни модификации на основната таблица. Опитът да се поддържа такъв брой не е непременно толкова лесен, колкото изглежда.
Обикновено бих предпочел да направя това изглед, който винаги ще бъде актуален и не се нуждае от задействане, което усложнява нещата:
create view postn_matrix as
select person_id, count(*)
from basetable
group by person_id;
Разбира се, може да тълкувам погрешно или прекалено опростявам това, което прави вашата основна(и) таблица(и) и какво ви трябва postn_matrix
за. Изглежда малко тривиално да имаш дори като гледка. Ако имате отделен person
и person_position
таблици, да речем, тогава можете да добавите външно съединение, за да видите хора без позиции:
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;