ループ(exit句がない-これを質問に変換することを失ったことを願っています)のため、pstn_matrix
にレコードを挿入しようとしています。 すべて 一致する:new.person_id
があるかどうかに関係なく、カーソルが返す値を記録します か否か;一致する場合は、update
も実行します 。これはおそらくあなたが望むものではなく、とりわけ制約違反が発生する可能性があります。また、カウンターフィールドを設定していません。それがnull許容でない場合は、エラーが発生します。しかし、どのようなエラーが発生しているのかについては、まだ述べていません。
トリガーを介してこれを行う必要がある場合は、新しい人の行があるかどうかを確認できます。
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;