Z powodu pętli (w której brakuje klauzuli wyjścia - mam nadzieję, że właśnie zgubiłeś to tłumaczenie na pytanie) spróbujesz wstawić rekord do pstn_matrix
dla każdego zapisz zwrot kursora, czy są jakieś pasujące :new.person_id
albo nie; a jeśli jest dopasowanie, wykonasz również update
. Co prawdopodobnie nie jest tym, czego chcesz i możesz między innymi naruszyć ograniczenia. Nie ustawiasz również swojego pola licznika - jeśli to nie jest możliwe do zerowania, spowoduje to błąd. Ale nie powiedziałeś, jakie błędy, jeśli w ogóle, otrzymujesz.
Jeśli musisz to zrobić za pomocą wyzwalacza, możesz albo sprawdzić, czy w ogóle istnieje wiersz dla nowej osoby:
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;
...
... lub użyj merge
.
Ale nie podoba mi się ten model i konfigurujesz potencjalne rozbieżności danych z równoczesnymi modyfikacjami tabeli podstawowej. Próba utrzymania takiego liczenia niekoniecznie jest tak prosta, jak się wydaje.
Zwykle wolałbym, aby był to widok, który zawsze będzie aktualny i nie wymaga komplikacji wyzwalacza:
create view postn_matrix as
select person_id, count(*)
from basetable
group by person_id;
Oczywiście mogę błędnie interpretować lub nadmiernie upraszczać, co robi twoja tabela bazowa i czego potrzebujesz postn_matrix
dla. Wydaje się to trochę trywialne mieć nawet jako widok. Jeśli masz oddzielną person
i person_position
powiedzmy, tabele, wtedy możesz dodać sprzężenie zewnętrzne, aby zobaczyć osoby bez pozycji:
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;