0

postn_matrix従業員のリストとその担当者の数を含む既存のテーブルがあります。組織内の位置。

ユーザーの位置が追加または削除されるたびに、対応するカウントがこのトリガーのテーブルに反映されます(VIA UPDATE)

これで、新しいユーザーがいる場合、そのユーザーにはエントリがないpostn_matrixため、そのユーザーの新しいレコードを挿入する必要があります(VIAINSERT)。これは、BASETABLEから取り込む必要があります。

アップデートは正常に機能しているようですが、新しいユーザーをテーブルに取り込むことができません。

私はこのケースをカーソルで処理しようとしてきました。しかし、それはまだ何の助けにもなりませんでした。専門家が私に光を見せてくれることを願っています..:)。カーソルの使用以外の提案は大歓迎です

CREATE OR REPLACE TRIGGER TRIG1
BEFORE INSERT OR DELETE ON (BASETABLE)
FOR EACH ROW
DECLARE
  cursor c1 is
  select person_id 
  from postn_matrix;

  v_temp varchar2(15);
BEGIN
  IF INSERTING THEN
    open c1;    
    LOOP
      fetch c1 into v_temp;

      if v_temp!=:new.person_id THEN
        insert into POSTN_MATRIX (PERSON_ID)
        VALUES (:new.PERSON_ID);
      else
        UPDATE POSTN_MATRIX
        //this is working fine ;

      END IF;
    end loop;
    close c1;

END
/
4

1 に答える 1

4

pstn_matrixループ(exit句が欠落している-これを質問に変換することを失ったことを願っています)のため、一致するものがあるかどうかに関係なく、カーソルが返すすべてのレコードにレコードを挿入しようとします: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。ビューとしても持つのは少し些細なことのようです。たとえば、個別personperson_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;
于 2012-07-20T13:43:59.007 に答える