Karena loop (yang tidak memiliki klausa keluar - mudah-mudahan Anda baru saja kehilangan menerjemahkan ini menjadi pertanyaan), Anda akan mencoba memasukkan catatan ke pstn_matrix
untuk setiap merekam kursor kembali, apakah ada yang cocok :new.person_id
atau tidak; dan jika ada kecocokan Anda juga akan melakukan update
. Yang mungkin bukan yang Anda inginkan, dan Anda mungkin mendapatkan pelanggaran kendala antara lain. Anda juga tidak menyetel bidang penghitung Anda - jika itu tidak dapat dibatalkan maka itu akan salah. Tapi Anda belum mengatakan kesalahan apa, jika ada, yang Anda dapatkan.
Jika Anda harus melakukan ini melalui pemicu maka Anda dapat memeriksa apakah ada baris untuk orang baru sama sekali:
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;
...
... atau gunakan merge
.
Tapi saya tidak suka model ini, dan Anda menyiapkan potensi perbedaan data dengan modifikasi bersamaan ke tabel dasar. Mencoba mempertahankan hitungan seperti ini tidak sesederhana kelihatannya.
Saya biasanya lebih suka membuat tampilan ini, yang akan selalu terbarui dan tidak memerlukan pemicu yang memperumit hal-hal:
create view postn_matrix as
select person_id, count(*)
from basetable
group by person_id;
Tentu saja, saya mungkin salah menafsirkan atau menyederhanakan apa yang dilakukan tabel dasar Anda dan apa yang Anda butuhkan postn_matrix
untuk. Tampaknya sedikit sepele untuk dimiliki bahkan sebagai pandangan. Jika Anda memiliki person
yang terpisah dan person_position
tabel, katakanlah, lalu Anda dapat menambahkan gabungan luar untuk melihat orang tanpa posisi:
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;